|
|
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 internaPróximo:A diferença entre as variáveis de definição let e var em js
|