2012-03-08 20 views
21

Así que mi entidad tiene:Seleccione MAX marca de tiempo con los Criterios JPA2 API

@Column(name="TS", nullable=false) 
private java.sql.Timestamp timestamp; 

Mi metamodelo generado tiene:

public static volatile SingularAttribute<MyEntity,Timestamp> timestamp; 

deseo seleccionar el valor máximo Marca de tiempo:

Root<MyEntity> root = query.from(MyEntity.class); 
Expression maxExpression = cb.max(root.get(MyEntity_.timestamp)); 

Pero no estoy permitido porque:

max(Expression<N> x) Crea una expresión agregada aplicando la operación numérica máxima. <N extends java.lang.Number> Expresión

Por supuesto Timestamp no se extiende Number.

¿Cómo puedo hacer un MAX en una columna Timestamp usando la API de criterios de seguridad tipo?

Gracias.

Respuesta

39

En lugar de max tiene que usar CriteriaBuilder.greatest para Timestamp (y para fecha, cadena y otros comparables también). Y si alguna vez necesita MIN para Timestamp, entonces utilice el método menos en su lugar

Se puede enfrentar un tipo similar de problema con comparaciones menos/mayores/iguales. Firs uno acepta argumento que se extiende Número, segundo es para otros comparables:

  • lt vs. lessThan
  • le vs. lessThanOrEqualTo
  • ge vs. greaterThanOrEqualTo
  • gt vs. greaterThan
+1

Gracias Mikko - Me perdí eso en los documentos de API. – planetjones

+0

sub.where (cb.greatest (histories.get ("activeDate"))); [ERROR] requerido: javax.persistence.criteria.Expression [ERROR] encontrado: javax.persistence.criteria.Path [ERROR] reason: el tipo inferido no se ajusta al límite superior (s)) –

Cuestiones relacionadas