2011-01-19 9 views
16



Proste pytanie:
W tym przykładzie muszę pobrać wszystkie obiekty, ale te obiekty muszą mieć odrębne pola msgFrom.
Gdy używamHQL: Jak wybrać wszystkie podmioty odrębne według niektórych kolumn?

List<Message> list = getHibernateTemplate().find("select distinct m.msgFrom from Message m WHERE msgTo = ? AND msgCheck = 0", dinc); 

mam następny błąd:

java.lang.ClassCastException: java.lang.Integer cannot be cast to com.example.model.Message 

Przypuszczam, że to dlatego, Hibernate pobiera tylko jedną kolumnę, ale muszę się obiektu, a nie kolumny.
Jak mogę to zrobić?
myślę, że mogę po prostu przewinąć przecinkiem, tj

List<Message> list = getHibernateTemplate().find("select distinct m.msgFrom, m.To, m.datetime, .......... from Message m WHERE msgTo = ? AND msgCheck = 0", dinc); 

ale co jeśli mam więcej niż 20 pól tutaj? Czy istnieje proste rozwiązanie?

Dzięki!

Odpowiedz

15

Poniżej znajduje się przykładowe zapytanie:

select e from Message e 
where e.msgFrom IN (select distinct m.msgFrom 
         from Message m 
         WHERE m.msgTo = ? 
         AND m.msgCheck = "0"); 

Alternatywnie, można również stosować kryteria API.

+0

Wielkie dzięki, to naprawdę działa !!!! – gennad

+0

Ale czy są jakieś przykłady, jak to zrobić za pomocą API Criteria? – gennad

+1

W jaki sposób interfejs API Criteria tworzy dynamiczne zapytania i redukuje awarie w czasie wykonywania - http://www.ibm.com/developerworks/java/library/j-typesafejpa/ –

23

Można również stosować kryteria i projekcji razem:

Criteria criteria = session.createCriteria(MyEntity.class); 
criteria.setProjection(Projections.distinct(Projections.property("id"))); 

Mam nadzieję, że komuś pomóc.

+0

Dzięki. A jeśli chcesz, aby wynik obejmował całą klasę wiadomości ze wszystkimi jej zestawami właściwości? –

4

Spróbuj tego, że pracował dla mnie:

SELECT FROM YourTableName 
WHERE somecolumnName=condition 
GROUP BY yourDistinctColumnName 
+1

HQL nie SQL ... –

0

mam odpowiedzi na Hibernate Query Language używać pól odrębne. Możesz użyć . Jeśli użyjesz zapytania SQL, to zwróci ono String List. Nie można użyć tej wartości zwracanej przez klasę jednostek. Tak więc odpowiedzią na rozwiązanie tego typu problemu jest użycie HQL z SQL.

"FROM FLIGHT_ROUTE F WHERE F.ROUTE_ID IN (SELECT SF.ROUTE_ID FROM FLIGHT_ROUTE SF GROUP BY SF.TO_CITY)"; 

Z zestawienia zapytań SQL zrobiło DISTINCT ROUTE_ID i wejście w postaci listy. I filtr zapytania IN odrębny TO_CITY z IN (lista).

Typ zwracany to typ jednostki typu Entity Bean. Możesz to zrobić w AJAX, na przykład AutoComplement.

Niech wszystko będzie OK

5

kryteria Hibernacja jest dość łatwy, aby wybrać różne wyniki. Jeśli chcesz pojedynczy wynik zostać zwrócone w prognozowanego wyniku, można użyć:

Criteria criteria = session.createCriteria(Message.class); 
criteria.setProjection(Projections.distinct(Projections.property("msgFrom "))); 
List<String> msgFromList = criteria.list(); 

Jeśli chcesz wynikiem obejmować całą klasę ze wszystkimi jego zestawu właściwości, można użyć Hibernacja spowodować Transformer,

Criteria criteria = session.createCriteria(Message.class); 
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
List<Message> messages = criteria.list(); 

Ale filtruje na podstawie encji root.

Albo

Criteria criteria = session.createCriteria(Message.class); 

ProjectionList projection = Projections.projectionList(); 
projection.add(Projections.distinct(Projections.property("msgFrom"))); 
//Add as many columns as you want using Projection 
projection.add(Projections.property("msgTo")); 
criteria.setProjection(projection); 

criteria.setResultTransformer(Transformers.aliasToBean(Message.class)); 
List<String> msgFromList = criteria.list(); 

Jak na swoje pytanie pierwsze rozwiązanie daje poprawny wynik.