No artigo acima, concluímos a implementação do menu Easyui. Clique aqui para visualizá -lo. Nesta seção, escreveremos principalmente sobre a classe de implementação CategoryServiceImpl para concluir a consulta em cascata do banco de dados. Geralmente, o projeto é feito de trás para a frente, primeiro prestamos o serviço (não extraímos o DAO e finalmente extraímos) e depois fazemos a camada superior após o término.
Antes de escrever, vamos dar uma olhada nas mesas no banco de dados:
soltar o banco de dados se existir compra; /*Crie banco de dados e defina a codificação*/ Crie o conjunto de caracteres padrão da loja de dados UTF8; usar loja; /*Excluir tabela de administrador*/ tabela de soltar se existir conta; /*Exclua a tabela de categoria do produto*/ tabela de gota se existir categoria; /*============================================================================================================= ======================================================= doc =============================================================================================================== ======================================================= doc Nome do login do administrador*/ login varchar (20),/*Nome do administrador*/ nome varchar (20),/*senha do administrador*/ passa varchar (20)); /*================================================================================================================ ================================================================================================================== ================================================================================================================== =================================================================================================================== FALSE, /* Chave estranha, qual administrador gerencia esta categoria* / account_id int, restrição AID_FK CHAVE ESTAGEM (Account_Id) Conta de referências (ID));
Existem principalmente duas tabelas, a tabela de categoria de produto e a tabela de administrador, e uma tabela de administrador associada à chave estrangeira é fornecida na tabela de categoria de produto. Ou seja, o produto e o administrador são um relacionamento muitos para um. Agora começamos a escrever informações da categoria para consultar produtos e precisamos de um administrador em cascata.
1. Implementar o método de consulta em cascata
Primeiro, defina esse método na interface CategoryService:
categoryService de interface pública estende BaseService <Categoria> {// Informações da categoria de consulta, Lista pública de administrador em cascata <Categoria> QueryJoinAccount (String Type); // Consulta com o nome da categoria} Em seguida, implementamos esse método na classe de implementação categoryServiceImpl da categoryService:
@Service ("CategoryService") Categoria de classe pública CategoryServiceImpl estende BasEserServiceImpl <Categoria> implementa a categoryService {@Override public List <Category> QueryJoinCoCont (Type String) {String HQL = "Da categoria C WHERE C.Type Like: Type"; retorno getSession (). CreateEquery (HQL) .SetString ("tipo", "%" + tipo + "%"). List (); }} Entre os dois modelos, atribuiremos um link para a anotação:
// @ManytoOne (Fetch = fetchtype.eager) @joincolumn (name = "account_id") public conta getAccount () {return this.Account; } // @onetomany (cascade = cascadeType.all, fetch = fetchtype.lazy, mapedby = "conta") public Set <category> getCategories () {return this.categories; } Em seguida, testamos na aula de teste:
@Runwith (springjunit4classrunner.class) @contextConfiguration (locations = "ClassPath: beans.xml") Categoria de classe pública CategoryServiceImpltest {@Resource CategoryService CategoryService; @Test public void testQueryJoinAccount () {for (Categoria C: CategoryService.QueryJoinCoCont ("" ")) {System.out.println (c); System.out.println (c.getAccount ()); }}} 2. Problemas com consultas em cascata
Se olharmos para a saída do console, podemos ver que ele enviou mais de uma instrução SQL, mas apenas a consultamos uma vez, então por que enviamos tantas declarações? Este é o problema comum de 1+n. O chamado problema 1+n é primeiro emitir uma declaração para consultar o objeto atual e, em seguida, emitir instruções para consultar o objeto associado, para que a eficiência se torne muito baixa. Existem apenas dois objetos aqui. Se houver mais objetos, a eficiência será bastante reduzida. Como devemos resolver esse problema?
Talvez você pense que, se você definir o busca para gerar FetchType.Lazy, não publicará várias instruções, mas isso definitivamente não é possível, porque depois de defini -lo como preguiçoso, não podemos obter o objeto da conta. A melhor solução é escrever a declaração HQL e usar o Fetch. Para detalhes, consulte a classe de implementação de categoryServiceImpl modificada:
@Service ("CategoryService") Categoria de classe pública CategoryServiceImpl estende BaseServiceImpl <Categoria> implementa categoryService {@Override Public List <Category> queryJoinCoConces (tipo string) {string hql = "da categoria C junta -se C. Conta When C.TyTe como: tipo:"; retorno getSession (). CreateEquery (HQL) .SetString ("tipo", "%" + tipo + "%"). List (); }} A junção esquerda significa consultar juntamente com a conta, buscar significa adicionar o objeto da conta à categoria, para que apenas uma instrução SQL seja enviada e a categoria retornada também contém o objeto da conta.
3. Complete a função de paginação
A paginação no hibernato é muito simples. Você só precisa chamar dois métodos setfirstresult e setMaxResults: vamos modificar a interface CategoryService e sua classe de implementação CategoryServiceImpl:
// CategoryService Public Interface CategoryService estende BasEserservice <Categoria> {// Informações da categoria de consulta, Lista pública de administrador em cascata <Categoria> queryJoinAccount (Tipo de String, Int Page, Int Size); /e e implementar paginação} // categoryServiceImpl @service ("categoryService") Categoria de classe pública ServiceImpl estende BaseServiceImpl <Categoria> implementa a categoria: @Override List <Category> de category categy (string inunk, finge, página de string) {stride category "C. retorno getSession (). CreateEquery (HQL) .SetString ("tipo", "%" + tipo + "%") .setFirstresult (((página 1) * tamanho) // Show .SetMaxResults (tamanho) // mostra vários .list (); }} Vamos testá -lo na aula de teste:
@Runwith (springjunit4classrunner.class) @contextConfiguration (locations = "ClassPath: beans.xml") Categoria de classe pública CategoryServiceImpltest {@Resource CategoryService CategoryService; @Test public void testQueryJoinCoCount () {for (Categoria C: CategoryService.QueryJoinCoCount ("", 1,2)) {// Mostrar a primeira página, 2 peças de dados por página System.out.println (C + "," + C.GetAccount ()); }}} Para esse fim, terminamos de escrever o método de serviço e concluímos a consulta em cascata e as funções de paginação das categorias de produtos.
(Nota: No final, fornecerei o download do código -fonte de todo o projeto! Todos são bem -vindos para coletar ou compartilhar)
Endereço original: http://blog.csdn.net/eson_15/article/details/51320212
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.