2011-10-14 20 views
5

Nonostante 3 ore di ricerca su google e ricerca nell'API non riesco a trovare alcun riferimento a se sia possibile utilizzare le funzioni del database all'interno di una query di criteri di sospensione. Per essere precisi:Utilizzo delle funzioni del database per trasformare le colonne in criteri di ibernazione

Vorrei accedere alla porzione di data del datetime in un database postgres e raggruppare in base a quello. Mi immagino la query sarebbe simile:

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

Questo non funziona avermi dato una "non poteva risolvere proprietà: Data (beginExam) ..." eccezione. Sembra che questa sia una cosa molto semplice da fare, e mi deve mancare qualcosa. Dato che anch'io sto costruendo le restrizioni dinamicamente (l'ho lasciato nell'esempio), sembra che i criteri siano il componente di ibernazione da usare per questo, ma sono aperto a qualsiasi suggerimento a questo punto, a parte il passo verso l'intero problema costruendo il mio gruppo da.

Grazie

risposta

1

Date un'occhiata a Projections.sqlProjection e Porjections.sqlGroupProjection

+0

ho fatto, a fondo. Tra i molti metodi per eq e tra non esiste un metodo per trasformare il valore della colonna in una data in modo che possa quindi essere confrontato o inserito in un gruppoProperty. – user996088

+0

@ user996088: qual è il tipo di dati di beginExam? puoi usare _any_ SQL in Projections.sqlProjection, quindi non vedo perché non dovresti essere in grado di convertirlo in una data. – tscho

+0

colpa mia. Nella mia angoscia non ho riconosciuto che gkamal mi avesse indicato nella giusta direzione con il link sbagliato. – user996088

8

Hai provato Projections.sqlProjection come questo

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(); 

o Projections.sqlGroupProjection come questo

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

Hibernate gene alias tariffe tavolo in query SQL, quindi potrebbe essere necessario aggiungere il frammento {alias} al frammento SQL per fare questo lavoro:

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(); 

o con SQLGroupProjection:

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

Ah! Perfetto, grazie mille. Ci lavorerò. – user996088

+0

@ user996088: Nota la mia modifica riguardante il frammento '{alias}', la mia soluzione suggerita ha funzionato? Sono un po 'curioso perché non ho effettivamente eseguito una delle query, le ho appena scritte qui (quindi potrebbero esserci degli errori di battitura) – tscho

+0

Grazie Tscho, il tuo ultimo esempio ha funzionato per me Proiezioni.sqlGroupProjection ... –

Problemi correlati