2012-12-21 7 views
10

Chcę napisać zapytanie o kryterium za pomocą "grupy według" i chcę zwrócić wszystkie kolumny.wybierz "wszystkie kolumny" z "grupa według" w zapytaniach kryterium hibernacji

Samolot sql jest tak:

select * from Tab group by client_name order by creation_time; 

Rozumiem, że będzie miał count(distinct client_name) liczbę wierszy.

Mój obecny zapytań, które nie wydają się dać właściwą wynik jest następujący:

Criteria criteria = getSession(requestType).createCriteria(Tab.class); 
     criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("client_name"))); 
     criteria.addOrder(Order.asc("creationTime")); 

Ta kwerenda zwraca "client_name" tylko. Nie chcę ręcznie wstawiać wszystkich nazw kolumn. Musi być jakiś sposób, co można zrobić?

+0

Sprawdź ten link: http://stackoverflow.com/questions/6678216/hibernate-select-all-projections-group-by – maximilianus

Odpowiedz

1

Myślę, że coś nie rozumiesz. Jeśli w SQL masz GROUP BY, musisz pogrupować według wszystkich wybranych kolumn. To samo dotyczy Hibernate - jeśli masz groupProperty w Projection, mówisz Hibernate, że ta kolumna jest kolumną grupy. Jeśli nie odwołujesz się do innych kolumn/pól, Hibernuj przyjmie, że ich nie chcesz, ponieważ one również muszą zostać zgrupowane.

Aby zrobić krok wstecz: co próbujesz zrobić? Jeśli masz zduplikowane dane w kolumnach wszystkie, możesz mieć nieprawidłowe dane lub niepoprawne utrwalanie danych. Przynajmniej twój klucz byłby zawalony.

0

W stanie hibernacji dla prognoz wszystkie wymagane kolumny muszą zostać dodane do listy projekcji. Aby uzyskać wynik w encji, musimy użyć setResultTransformer. Sprawdź poniżej przykład uzyskać przez grupę w hibernacji:

ProjectionList projectionList = Projections.projectionList(); 
    projectionList.add(Projections.groupProperty("column1")); 
    projectionList.add(Projections.property("column2")); 
    projectionList.add(Projections.property("column3")); 
    criteria.setProjection(projectionList); 
    criteria.setResultTransformer(Transformers.aliasToBean(Table.class)); 
0

przy użyciu projekcji hibernacji należy dodać wszystkie kolumny, które są potrzebne w liście projekcji. użyłeś tylko Projections.projectionList(). add (Projections.groupProperty ("nazwa_klienta"))

to. więc jasne jest, że zwraca tylko nazwa_klienta.