|
|
Opublikowano 09.08.2017 14:26:13
|
|
|

Załóżmy teraz, że istnieje klasa Student z atrybutami id, imię, wiek Ciąg hql = "od Student s"; Jak to robiliśmy kiedyś, tak zwykle robimy Query query = session.createQuery(hql); Albo jeśli chcesz szukać zgodnie z warunkami. String hql = "od Studenta gdzie s.name jak 'King%'" Query query = session.createQuery(hql); Jeśli używasz QBC zamiast HQL, to kod jest następujący: Kryteria =session.createCriteria(Student.class); Kryterium = Expression.like("imię", "king%"); Nie widzę tego w ten sposób. Następnie dodajemy warunek wyszukiwania do wieku 22 lat.
HQL: String hql = "od Student s gdzie s.name jak 'Wang%' i s.age = 22 "; Query query = session.createQuery(hql); List list = query.list();
QBC: Kryteria =session.createCriteria(Student.class); Kryterium 1 = Expression.like("name","king%"); Kryterium kryterium 2 = Expression.eq("wiek",newInteger(22)); kryteria.add(criterion1).add(criterion2); List list = criteria.list();
Wygląda to na dużo bardziej nieporęczne. Ale każdy, kto realizował projekt, wie, że gdy logika biznesowa modułu się zmienia, często trzeba on przepisać SQL, a najbardziej irytujące i irytujące jest przyjęcie czyjegoś HQL lub SQL. Jeśli używasz QBC, znacznie zwiększa to czytelność i łatwość utrzymania kodu. Ważne jest, aby zauważyć, że wartość zerowa to wartość Na przykład, gdy chcemy znaleźć obiekt Student o nazwie null, powinniśmy zapisać go w ten sposób Kryteria =session.createCriteria(Student.class); Kryterium = Expression.isNull("nazwa"); kryteria.add(criterion).list(); i używając pomiędzy... i czas Kryteria =session.createCriteria(Student.class); Kryterium 1 = Expression.ge("wiek", nowa liczba całkowita(20)); Dolna granica Kryterium kryterium 2 = Expression.le("wiek", nowa liczba całkowita(25)); Sufit
//这里也可以把上述两个条件添加到第三个条件里 Kryterium 3 =Expression.and(criterion1,criterion2); kryteria.add(criterion3).list(); Równoważne jest to dla uczniów w wieku od 20 do 25 lat Równoważne dla od ucznia s, gdzie s.wiek >= 20 i s.wiek <=25
Poniżej znajduje się porównanie najczęściej stosowanych warunków zapytań HQL i QBC Wyrażenie oznaczające HQL QBC większe lub równe > = Expression.ge() Większy niż > Expression.gt() Mniejsze lub równe < = Expression.le() Mniej niż < Expression.lt() równa się = Expression.eq() nie równa się <>lub!= Expression.ne()
Null to null Expression.isNull() is notnull Expression.isNotNull() W określonym zakresie między, Expression.between() Nie w określonym zakresie not betweenand i Expression.not(Expression.between()) Należąca do kolekcji w Expression.in() Nie jest częścią kolekcji notin Expression.not(Expression.in()) oraz expression.and() lub Expression.or() Nie expression.not() Zapytanie rozmyte jak Expression.like
1. Utworzenie instancji Criteria net.sf.hibernate.Criteria Ten interfejs reprezentuje zapytanie dla konkretnej klasy trwałości. Session to fabryka używana do produkcji instancji Criterion.
Kryteria krytyka = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2. Zawęzenie zakresu zbioru wyników Warunek zapytania (Kryterium) to instancja interfejsu net.sf.hibernate.expression.Criterion. Klasa net.sf.hibernate.expression.Expression definiuje tak, aby uzyskać wbudowane typy Criterion.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.between("weight", minWeight, maxWeight))
.list(); Wyrażenia można grupować logicznie.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.or( Expression.eq( "age", new Integer(0) ), Expression.isNull("age")))
.list();
List cats = sess.createCriteria(Cat.class)
.add( Expression.in( "name",new String[]{"Fritz","Izi","Pk"}))
.add( Expression.disjunction()
.add( Expression.isNull("wiek") )
.add( Expression.eq("age", nowa liczba całkowita(0) ) )
.add( Expression.eq("age", nowa liczba całkowita(1) ) )
.add( Expression.eq("wiek", nowa liczba całkowita(2) ) ) ) )
.list(); Istnieje wiele gotowych typów warunków (podklasy wyrażeń). Jest szczególnie przydatny przykład, który pozwala bezpośrednio osadzać SQL.
List cats = sess.createCriteria(Cat.class)
.add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING))
.list(); gdzie {alias} jest zastępczym, zostanie zastąpiony aliasem linii zapytania. (Oryginalne: Zastępca {alias} z by został zastąpiony aliasem wiersza zapytania.)
3. Sortuj wyniki Możesz użyć net.sf.hibernate.expression.Order, aby posortować zbiór wyników.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.addOrder( Order.asc("name"))
.addOrder( Order.desc("age"))
.setMaxResults(50)
.list();
4. Powiązania Możesz użyć createCriteria() między powiązaniami, aby łatwo określić ograniczenia między podmiotami z relacjami.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.createCriteria("kocięta")
.add( Expression.like("name","F%")
.list();
Zwróć uwagę, że drugi createCriteria() zwraca nową instancję Criteria, wskazując na element klasy kolekcji kittens. Poniższe alternatywne formy są przydatne w określonych sytuacjach.
List cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add(Expression.eqProperty("kt.name", "mt.name"))
.list();
(createAlias()) nie tworzy nowej instancji Kryteriów. Należy zauważyć, że klasa kolekcji kociąt należąca do instancji Cat w dwóch poprzednich zapytaniach nie jest wstępnie filtrowana według kryteriów! Jeśli chcesz zwracać tylko kocięta spełniające kryteria, musisz użyć returnMaps().
List cats = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Expression.eq("name", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
while ( iter.hasNext())
{
Map map = (Map) iter.next();
Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
Kociak = (Kot) map.get("kt");
}
5. Dynamiczne pobieranie asocjacji Możesz zmienić politykę automatycznego pobierania obiektów asocjacji, ustawiając FetchMode() w czasie działania.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.list();
To pytanie pozwoli zarówno partnerowi, jak i kociakom przez zewnętrzne połączenie.
6. Zgodnie z przykładowymi zapytaniami net.sf.hibernate.expression.example, można tworzyć warunki zapytania z określonej instancji.
Kot kot = nowy Kot();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list(); Właściwości wersji, właściwości reprezentacji i skojarzeń są pomijane. Domyślnie atrybuty zerowe również są wykluczone. Możesz dostosować sposób zastosowania Przykładu. Można aby dostosować sposób zastosowania przykładu. Przykładowy przykład = Example.create(cat) .excludeZeroes() //exclude właściwości o wartości zerowej
.excludeProperty("color") //wyłącz właściwość o nazwie "color" .ignoreCase() //wykonuj porównania ciągów niezależnych od przypadków
.enableLike(); Zastosowanie like do porównań strun
List results = session.createCriteria(Cat.class)
.add(example)
.list(); Możesz nawet użyć przykładów do ustalania kryteriów dla powiązanych obiektów. List results = session.createCriteria(Cat.class) .add(Example.create(cat) )
.createCriteria("mate") .add(Example.create(cat.getMate())) .list();
Kod referencyjny jest następujący:
|
Poprzedni:LINQ połączenia lewo, prawe i wewnętrzneNastępny:Różnica między zmiennymi definicyjnymi niech i var w js
|