Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 16672|Odpowiedź: 0

[Źródło] Szczegółowe użycie createCriteria to zapytanie QBC w Hibernate

[Skopiuj link]
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ętrzne
Następny:Różnica między zmiennymi definicyjnymi niech i var w js
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com