2011-10-14 13 views
5

A pesar de 3 horas de búsqueda en Google y búsqueda en la API, no encuentro ninguna referencia sobre si es posible usar funciones de base de datos dentro de una consulta de criterios de hibernación. Para ser específico:Uso de funciones de base de datos para transformar columnas en criterios de hibernación

Me gustaría acceder a la parte de fecha de la fecha y hora en una base de datos de postgres y agruparlo. Me imagino que la consulta sería algo como:

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

Esto no funciona y me dio un "no podía resolver la propiedad: Fecha (beginExam) ..." es una excepción. Parece que esto es algo muy simple de hacer, y debo estar perdiendo algo. Dado que también estoy construyendo restricciones dinámicamente (lo dejé en el ejemplo), parece que el criterio es el componente de hibernación que se debe usar para esto, pero estoy abierto a cualquier sugerencia en este punto, dejando de lado todo el asunto. construyendo mi propio grupo por.

Gracias

Respuesta

1

miren Projections.sqlProjection y Porjections.sqlGroupProjection

+0

lo hice, a fondo. Entre los muchos métodos para eq y entre ellos, no existe un método para transformar el valor de la columna en una fecha, por lo que luego se puede comparar o poner en una propiedad de grupo. – user996088

+0

@ user996088: ¿Cuál es el tipo de datos de beginExam? puede usar _any_ SQL en Projections.sqlProjection, así que no veo por qué no debería poder convertirlo a una fecha. – tscho

+0

Mi culpa. En mi angustia no reconocí que gkamal me había señalado en la dirección correcta con el enlace equivocado. – user996088

8

¿Usted ha intentado Projections.sqlProjection como esto

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 como esto

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

gen Hibernate alias de tabla de los tipos de consultas SQL, por lo que puede que tenga que añadir el fragmento {alias} a su fragmento de SQL para hacer este trabajo:

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! Perfecto, muchas gracias. Voy a trabajar en eso. – user996088

+0

@ user996088: Tenga en cuenta mi edición con respecto al fragmento '{alias}', ¿funcionó mi solución sugerida? Soy un poco curioso porque no ejecuté realmente una de las consultas, simplemente las escribí aquí (por lo que también podría haber errores tipográficos) – tscho

+0

Gracias Tscho, tu último ejemplo funcionó para mí Projections.sqlGroupProjection ... –

Cuestiones relacionadas