Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 16672|Resposta: 0

[Fonte] O uso detalhado do createCriteria é a consulta QBC no Hibernate

[Copiar link]
Publicado em 09/08/2017 14:26:13 | | |

Agora digamos que exista uma turma de Estudante com atributos de id, nome e idade
String hql = "do Estudante s";
Como costumávamos fazer, geralmente fazemos
Consulta de consulta = session.createQuery(hql);
Ou se quiser buscar de acordo com as condições.
String hql = "de Students s onde s.name como 'King%'"
Consulta de consulta = session.createQuery(hql);
Se você usar QBC em vez de HQL, então o código é:
Critérios critérios =session.createCriteria(Student.class);
Critério de critério = Expression.like("nome","king%");
Não consigo ver assim. Depois, adicionamos a condição de busca à idade de 22 anos.
HQL:
String hql = "de Estudantes s onde s.name como 'Wang%' e s.age = 22 ";
Consulta de consulta = session.createQuery(hql);
Lista lista = query.list();
QBC:
Critérios critérios =session.createCriteria(Student.class);
Critério critério1 = Expression.like("name","king%");
Critério critério2 = Expression.eq("idade",newInteger(22));
critérios.add(critério1).add(critério2);
Lista lista = criteria.list();


Parece muito mais complicado. Mas qualquer pessoa que já fez um projeto sabe que, quando a lógica de negócios de um módulo muda, muitas vezes ele precisa reescrever SQL, e a coisa mais irritante e irritante é pegar o HQL ou SQL de outra pessoa.
Se você usar o QBC, isso aumenta muito a legibilidade e a manutenção do código.
É importante notar que o valor nulo é o valor
Por exemplo, quando queremos encontrar um objeto Student com nome nulo, devemos escrevê-lo assim
Critérios critérios =session.createCriteria(Student.class);
Critério de critério = Expression.isNull("nome");
critérios.add(critério).lista();
e usando entre... e tempo
Critérios critérios =session.createCriteria(Student.class);
Critério critério1 = Expression.ge("idade",novo Inteiro(20)); Limite inferior
Critério critério2 = Expression.le("idade",novo Inteiro(25)); Teto
//这里也可以把上述两个条件添加到第三个条件里
Critério critério3 = Expressão.and(critério1,critério2);
critérios.add(criterion3).list();
Equivalente a estudantes com idade entre 20 e 25 anos
Equivalente a de Estudantes s, onde s.idade >= 20 e s.idade <=25


A seguir está uma comparação das condições de consulta comumente usadas entre HQL e QBC
Expressão significando HQL QBC
maior ou igual a > = Expression.ge()
Maior que > Expression.gt()
Menor ou igual a < = Expression.le()
Menos que < Expression.lt()
igual = Expressão.eq()
não é igual a <>ou!= Expression.ne()

Nulo é nulo Expression.isNulo()
is notnull Expression.isNotNull()
Dentro do intervalo especificado entre e Expression.between()
Não está no intervalo especificado, não entre, e Expression.not(Expression.between())
Pertencente a uma coleção em Expression.in()
Não faz parte de uma coleção, não é Expression.not(Expression.in())
e expression.and()
ou Expression.or()
Não Expression.not()
Consulta difusa como o Expression.like



1. Criar uma instância de Criteria net.sf.hibernate.Criteria Esta interface representa uma consulta para uma classe de persistência específica. Session é a fábrica usada para fabricar a instância Criteria.



Critérios crítico = sess.createCriteria(Cat.class);


crit.setMaxResults(50);


Lista gatos = crit.list();


2. Restringir o escopo do conjunto de resultados Uma condição de consulta (Criterion) é uma instância da interface net.sf.hibernate.expression.Criterion. A classe net.sf.hibernate.expression.Expression define para obter alguns tipos de Criterion embutidos.


Lista gatos = sess.createCriteria(Cat.class)


                .add( Expression.like("nome", "Fritz%") )


                .add( Expression.between("weight", minWeight, maxWeight))


                .list();
Expressões podem ser agrupadas logicamente.

Lista gatos = sess.createCriteria(Cat.class)



                .add( Expression.like("nome", "Fritz%") )


                .add( Expression.or( Expression.eq( "age", new Integer(0)), Expression.isNull("age")))


                .list();


Lista gatos = sess.createCriteria(Cat.class)


                .add( Expression.in( "name",new String[]{"Fritz","Izi","Pk"}))


                .add( Expression.disjunction()


                .add( Expression.isNull("age") )


                .add( Expression.eq ("age", novo Inteiro(0) )


                .add( Expression.eq("age", novo Inteiro(1) )


                .add( Expression.eq ("age", novo Inteiro(2) ) ) ) )


                 .list();
Existem muitos tipos de condição pré-definidos (subclasses de Expressões). Existe um particularmente útil que permite incorporar SQL diretamente.

Lista gatos = sess.createCriteria(Cat.class)



                .add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING))


                .list();  
onde {alias} é um marcador de lugar, ele será substituído pelo alias de linha da entidade consultada. (Original: O {alias} será substituído pelo alias da linha da entidade consultada.)


3. Ordenar os resultados Você pode usar net.sf.hibernate.expression.order para ordenar o conjunto de resultados.


Lista gatos = sess.createCriteria(Cat.class)



                .add( Expression.like("nome", "F%")


                .addOrder( Order.asc("nome"))


                .addOrder( Order.desc("age"))


                .setMaxResults(50)


                .list();


4. Associações Você pode usar createCriteria() entre associações para especificar facilmente restrições entre entidades com relacionamentos.

Lista gatos = sess.createCriteria(Cat.class)



                 .add( Expression.like("nome", "F%")


                 .createCriteria("filhotes")


                 .add( Expression.like("name","F%")


                 .list();


Note que o segundo createCriteria() retorna uma nova instância de Criteria, apontando para um elemento da classe de coleção kittens. As seguintes formas alternativas são úteis em situações específicas.


Lista gatos = sess.createCriteria(Cat.class)


                .createAlias("kittens", "kt")


                .createAlias("companheiro", "mt")


                .add(Expression.eqProperty("kt.name", "mt.name"))


                .list();


(createAlias()) não cria uma nova instância dos Critérios. Note que a classe de coleção de gatinhos mantida pela instância do Gato nas duas consultas anteriores não é pré-filtrada por critérios! Se quiser devolver apenas filhotes que atendam aos critérios, deve usar returnMaps().


Lista gatos = sess.createCriteria(Cat.class)


.createCriteria("gatinhos", "kt")


.add( Expression.eq ("nome", "F%") )


.returnMaps()


.list();


Iterador iter = cats.iterator();


while ( iter.hasNext())


{  


Mapa mapa = (Mapa) iter.next();


Gato gato = (Gato) map.get(Criteria.ROOT_ALIAS);


Gato gatinho = (Gato) map.get("kt");


}


5. Busca dinâmica de associações Você pode alterar a política automática de busca dos objetos de associação definindo FetchMode() em tempo de execução.



Lista gatos = sess.createCriteria(Cat.class)


                .add( Expression.like("nome", "Fritz%") )


                .setFetchMode("mate", FetchMode.EAGER)


                .list();


Essa consulta vai obter tanto o parceiro quanto os filhotes via junção externa.


6. De acordo com a classe Example queries net.sf.hibernate.expression.Example, você pode criar condições de consulta a partir da instância especificada.


Gato gato = novo Gato();


cat.setSex('F');


cat.setColor(Color.BLACK);


Resultados da lista = session.createCriteria(Cat.class)


                    .add( Example.create(cat) )


                    .list();
Propriedades de versão, representação e associações são todas ignoradas. Por padrão, atributos nulos também são excluídos. Você pode ajustar como o Exemplo é aplicado. É possível
para ajustar como o exemplo é aplicado. Exemplo exemplo = Exemplo.create(cat) .excludeZeroes() //exclude propriedades com valor zero


.excludeProperty("color") //exclude a propriedade chamada "color" .ignoreCase() //realize comparações de strings insensíveis a maiúsculas minúsculas


.enableLike(); Uso de Like para comparações de cordas


Resultados da lista = session.createCriteria(Cat.class)


                      .add(exemplo)


                      .list();
Você pode até usar exemplos para estabelecer critérios para objetos associados. Resultados da lista = session.createCriteria(Cat.class) .add(Example.create(cat) )


.createCriteria("mate") .add(Example.create(cat.getMate())) .list();


O código de referência é o seguinte:






Anterior:LINQ conexões esquerda, direita e interna
Próximo:A diferença entre as variáveis de definição let e var em js
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com