2011-10-14 16 views
5

Mimo 3 godzin szukania i wyszukiwania w interfejsie API nie mogę znaleźć żadnego odniesienia do tego, czy możliwe jest korzystanie z funkcji bazy danych w zapytaniu o kryterium hibernacji. Aby być konkretnym:Używanie funkcji bazy danych do transformacji kolumn w kryteriach hibernacji

Chciałbym uzyskać dostęp do części daty datetime w bazie danych postgres i grupy przez to. Wyobrażam sobie zapytanie będzie wyglądać następująco:

session.createCriteria(Exam.class) 
    .setProjection(Projections.projectionList() 
    .add(Projections.property("DATE(beginExam)").as("beginDate")) 
    .add(Projections.groupProperty("beginDate"))) 
    .list(); 

To nie działa dając mi „nie można rozwiązać właściwość: data (beginExam) ...” wyjątek. Wygląda na to, że jest to bardzo prosta rzecz i muszę czegoś nie zauważyć. Biorąc pod uwagę, że jestem również dynamicznie budujący ograniczenia (zostawiłem to w tym przykładzie) wydaje się, że kryterium jest elementem hibernacji, którego można użyć do tego celu, ale jestem otwarty na wszelkie sugestie w tym miejscu, które niedługo rozwiną cały problem. budując własną grupę przez.

Dzięki

Odpowiedz

1

przyjrzeć Projections.sqlProjection i Porjections.sqlGroupProjection

+0

Zrobiłem dokładnie. Wśród wielu metod dla eq i pomiędzy nie ma metody przekształcania wartości kolumny na datę, aby można było ją następnie porównać lub umieścić w groupProperty. – user996088

+0

@ user996088: Jaki jest typ danych beginExam? możesz użyć _any_ SQL w Projections.sqlProjection, więc nie rozumiem, dlaczego nie można przekonwertować go na datę. – tscho

+0

Moja wina. W moim gniewie nie zauważyłem, że gkamal wskazał mi właściwy kierunek z niewłaściwym łącznikiem. – user996088

8

Czy próbowałeś Projections.sqlProjection jak ten

session.createCriteria(Exam.class) 
    .setProjection(Projections.projectionList() 
    .add(Projections.sqlProjection("date(beginExam) as beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE })) 
    .add(Projections.groupProperty("beginDate"))) 
.list(); 

lub Projections.sqlGroupProjection jak ten

session.createCriteria(Exam.class) 
    .setProjection(Projections.sqlGroupProjection("date(beginExam) as beginDate", "beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE })) 
.list(); 

genu hibernacji ceny aliasów tabel w zapytaniach SQL, więc może trzeba dodać {alias} fragment do SQL fragmentu do tej pracy:

session.createCriteria(Exam.class) 
    .setProjection(Projections.projectionList() 
    .add(Projections.sqlProjection("date({alias}.beginExam) as beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE })) 
    .add(Projections.groupProperty("beginDate"))) 
.list(); 

lub z SQLGroupProjection:

session.createCriteria(Exam.class) 
    .setProjection(Projections.sqlGroupProjection("date({alias}.beginExam) as beginDate", "beginDate", new String[] { "beginDate" }, new Type[] { StandardBasicTypes.DATE })) 
.list(); 
+0

Ah! Idealnie, bardzo dziękuje. Przejdę przez to. – user996088

+0

@ user996088: Zapamiętaj moją edycję dotyczącą fragmentu '{alias}', czy moje sugerowane rozwiązanie działa? Jestem trochę ciekawy, ponieważ nie udało mi się wykonać jednego z zapytań, po prostu napisałem je tutaj (więc równie dobrze mogą być literówki) – tscho

+0

Dzięki Tscho, twój ostatni przykład zadziałał dla mnie Projections.sqlGroupProjection ... –

Powiązane problemy