Vamos falar sobre a consulta de critérios, o que é fácil para nós, programadores que não estão muito familiarizados com as declarações SQL.
Sem mais delongas, vamos dar uma olhada no exemplo:
A aula de entidade é a seguinte:
classe pública o usuário implementa serializável {private estático final serialversionuid = 1L; Public Long Id; nome de string privado; private Int Age; // omita o método Get/Set} Não vamos escrever o arquivo de mapeamento, é uma entidade muito simples. Se você não entende os sapatos infantis, consulte meus outros artigos na categoria Hibernate.
Em seguida, vamos ver como usar os critérios para consultar:
public static void main (string [] args) {Configuration cfg = new Configuration (). Configure (); Sessionfactory sessfactory = cfg.buildSessionFactory (); Sessão session = sessionFactory.opensssion (); Critérios critérios = session.createcriteria (user.class); critério.add (restrições.eq ("nome", "shun")); Lista de lista = critério.List (); Iterator iter = list.iterator (); while (iter.hasNext ()) {usuário do usuário = (usuário) iter.Next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); } Vendo o código, é uma string muito simples.
Todos estamos familiarizados com os anteriores e vemos o código após a construção da sessão:
Critérios critérios = session.createcriteria (user.class); critério.add (restrições.eq ("nome", "shun")); Essas duas frases de código são os principais pontos. Vamos analisar o que exatamente isso significa?
Na primeira frase, obtemos um objeto da classe de implementação de critérios por meio da sessão e, na segunda frase, adicionamos uma condição através do método ADD e o EQ representa a igualdade. Hibernate3 foi implementado anteriormente por meio de expressão.eq. Após 3, como os critérios foram abandonados, usamos a classe de restrições para implementá -la, que é a mesma que a expressão. Vejamos a API e encontrar que a expressão herda das restrições.
Voltando às nossas duas frases acima, depois de terminarmos essas tarefas, o Hibernate realmente nos ajudou a construir
Selecione * do usuário onde o nome = 'Shun'
Tal afirmação. (Aqui, a tabela correspondente à classe de usuário em nosso arquivo de mapeamento é a tabela de usuários e o atributo de nome corresponde ao campo Nome)
As restrições também têm muitos métodos para nos ajudar a construir declarações SQL. É fácil de entender depois de verificar a API.
Vamos procurar novamente o código acima. Se encerrarmos a sessão, mas queremos continuar usando esse critério, tudo bem? Vamos dar uma olhada.
Após o código acima, mudamos novamente, adicionando:
Lista list2 = critério.list (); Iterator iter2 = list.iterator (); while (iter.hasNext ()) {usuário do usuário = (usuário) iter.Next (); System.out.println (user.getName ()+":"+user.getage ()); } Para distinguir a diferença entre a lista anterior e o ITER, usamos outra aqui.
Execute -o e temos uma exceção:
org.hibernate.sessionException: a sessão está fechada!
Relatar esta exceção significa que a sessão foi fechada. Em muitos casos, relataremos exceções semelhantes após o fechamento da sessão e, em seguida, executar operações relacionadas ao SaveorUpdate, Save, etc.
O Hibernate3 leva em consideração nossas necessidades e implementa um destacado, que pode existir independentemente da sessão.
Vamos dar uma olhada no exemplo: (a entidade ainda está acima)
public static void main (string [] args) {Configuration cfg = new Configuration (). Configure (); Sessionfactory sessfactory = cfg.buildSessionFactory (); Sessão session = sessionFactory.opensssion (); Decritério de DetachedCritérios = DetachedCriteria.forclass (user.class); descriteria.add (restrições.eq ("nome", "shun")); Lista Lista = Decliterio.GetexecutableCriteria (Sessão) .List (); Iterator iter = list.iterator (); while (iter.hasNext ()) {usuário do usuário = (usuário) iter.Next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); Sessão session2 = sessionFactory.opensssion (); LISTA LIST2 = Decritério.GetexecutableCriteria (session2) .List (); Iterator iter2 = list2.iterator (); while (iter2.hasNext ()) {usuário do usuário = (usuário) iter2.next (); System.out.println (user.getName ()+":"+user.getage ()); }} Vemos que, depois que a sessão estiver fechada, podemos continuar usando o DetacedCriteria em outra conexão. Precisamos associar os atuais critérios de destacar a uma determinada sessão através do getExecutablecriteria (sessão).
Em seguida, vamos dar uma olhada na combinação de aula de subconsciência e destacar -se:
public static void main (string [] args) {Configuration cfg = new Configuration (). Configure (); Sessionfactory sessfactory = cfg.buildSessionFactory (); Sessão session = sessionFactory.opensssion (); Decritério de DetachedCritérios = DetachedCriteria.forclass (user.class); descriteria.setProjeção (projeção.avg ("idade")); Critérios critérios = session.createcriteria (user.class); critérios.add (subquérito.propertygt ("idade", descritria)); Lista de lista = critério.List (); Iterator iter = list.iterator (); while (iter.hasNext ()) {usuário do usuário = (usuário) iter.Next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); } Eu acho que a primeira frase de código você tem dúvidas:
descriteria.setProjeção (projeção.avg ("idade")); Este código refere -se à obtenção do valor médio da idade por meio de descritérios. Em seguida, obtenha o objeto com uma idade maior que o valor médio abaixo.
As projeções contêm muitos métodos de encapsulamento que implementam métodos SQL. Você pode dar uma olhada na API.
Vamos aprender sobre seu uso um pouco mais avançado.
Basta olhar para o código:
critério.setFirstresult (10); critério.setMaxResults (20);
Aqui, definimos o registro inicial como o artigo 10 e encontramos 20 registros do artigo 10. De acordo com essa prática, podemos implementar a função básica de paginação.
Obviamente, precisamos classificar em muitos casos, e os critérios também apoiam:
critérios.Addorder (Order.Desc ("Age")); Aqui, podemos usar o método do Addorder diretamente e obter um objeto de ordem através da ordem.desc, que requer um parâmetro de atributo. De fato, quando chamamos o Addorder, o Hibernate nos ajudará a gerar ordem por idade, tal declaração.
Como fazemos isso quando precisamos agrupá -lo? Isso requer o método GroupProperty da aula de projeções que mencionamos da última vez.
critério.setProjeção (projection.groupproperty ("idade"); Aqui, agrupamos de acordo com o atributo de idade, que é realmente agrupado pela idade de campo, correspondendo à idade. O Hibernate o converterá automaticamente em uma declaração como o grupo por idade.
Existem muitos métodos práticos em projeções (observe que isso só está disponível após o hibernado 3).