2010-11-23 11 views
10

Estoy tratando de usar el siguiente código para obtener una lista de objetos de experiencia de una tabla MySQL. Cada experiencia tiene una columna datetime y una columna datetime y solo quiero tirar de las filas donde la fecha de hoy se encuentra entre el y desde.Uso de criterios de JPA/Hibernate para pasar de una fecha

Estoy usando JPA 2.0 saliendo de Hibernate.

Date currentDate = new Date(); 
    CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<Experience> query = builder.createQuery(Experience.class); 
    Root<Experience> root = query.from(Experience.class); 
    builder.between(currentDate, root.get("from"), root.get("to")); 
    return entityManager.createQuery(query).getResultList(); 

Mi problema es que builder.between() obviamente me prohibirá el paso de un objeto Date.

¿Existe una solución mejor a mi problema?

Respuesta

19

Puede pasarlo como un parámetro:

ParameterExpression<Date> d = builder.parameter(Date.class); 
builder.between(d, root.<Date>get("from"), root.<Date>get("to")); 
return entityManager.createQuery(query) 
    .setParameter(d, currentDate, TemporalType.DATE).getResultList(); 

Nótese que en este caso es necesario especificar el tipo temporal deseada.

También puede confiar en la fecha de la base de datos actual: builder.currentDate(), builder.currentTimestamp(), etc

+1

Gracias - eso es perfecto. Mi problema ahora es que, por algún motivo, root.get ("desde") devuelve un objeto Path y no un objeto Expression. – christophmccann

+0

@Christopher: 'Path' es un subtipo de' Expression'. – axtavt

+0

Los objetos devueltos de root.get() son de objeto supertipo genérico no Fecha. Pero el primer parámetro es de supertipo genérico Fecha. Los tres deben tener el mismo supertipo. ¿Algunas ideas? – christophmccann

2

Este enlace se ve prometedor: http://www.javalobby.org/articles/hibernatequery102/

Usted puede utilizar el criteria.ge("date", root.get("from")); y criteria.le("date"), root.get("to")); para crear el Noel entre

Si aquellos que no están disponibles, entonces puede que tenga que mirar en la escritura HQL.

+1

poco formateado, se ve mejor ahora –

6

Debe cambiar sus argumentos:

builder.between(root.<Date>get("dateColumn"), startDate, endDate); 
8

Estás solo falta la llamada a CriteriaBuilder.literal():

Date currentDate = new Date(); 
CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Experience> query = builder.createQuery(Experience.class); 
Root<Experience> root = query.from(Experience.class); 
builder.between(builder.literal(currentDate), root.get("from"), root.get("to")); 
return entityManager.createQuery(query).getResultList(); 
Cuestiones relacionadas