Comparar la Fecha de entidades JPA Criterios API

El uso de JPA 2 con EclipseLink aplicación.

Estoy tratando de construir una dinámica de consulta que debe traerme algunos registros persistió después de una fecha dada.

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Event> criteria = builder.createQuery(Event.class);
Root<Event> root = criteria.from(Event.class);
criteria.select(root);
criteria.distinct(true);
List<Predicate> predicates = new ArrayList<Predicate>();
//...
if (dateLimit != null){
    ParameterExpression<Date> param = builder.parameter(Date.class, "dateLimit");
    predicates.add(builder.lessThanOrEqualTo(root.get("dateCreated"), param));
}

lessThanOrEqualTo() y le() son los únicos dos métodos de la API que ver como me puede ayudar en este caso. Esta advertencia se produce por el eclipse, aunque:

Bound mismatch: The generic method lessThanOrEqualTo(Expression<? extends Y>, Expression<? extends Y>)
of type CriteriaBuilder is not applicable for the arguments (Path<Object>, ParameterExpression<Date>).
The inferred type Object is not a valid substitute for the bounded parameter
<Y extends Comparable<? super Y>>

Me imagino que no estoy tomando el enfoque correcto para este problema pero no puedo encontrar en cualquier lugar algunos tips o consejos para una posible solución.

InformationsquelleAutor Ionut | 2012-02-25

3 Kommentare

  1. 69

    El problema es que con la cadena-basado en la API se puede inferir el tipo por el valor del resultado de la get-Operación. Esto se explica, por ejemplo, en Javadoc para la Ruta.

    Si utiliza

    predicates.add(builder.lessThanOrEqualTo(root.<Date>get("dateCreated"), param));

    lugar, va a funcionar bien, porque se puede averiguar el tipo de retorno del tipo de argumento y se enteran de que es comparable. Observe que el uso de un parametrizar la invocación del método root.<Date>get(...) (ver, por ejemplo, Cuando está parametrizada llamada al método útil?).

    Otro (en mi opinión mejor solución es usar el metamodelo base API en lugar de la cadena-basado en uno. Un ejemplo sencillo sobre canónica del metamodelo se da por ejemplo aquí. Si usted tiene más tiempo para invertir, este es un buen artículo acerca de la estática del metamodelo: Dinámico, typesafe consultas en JPA 2.0

    • NetBeans 8.2 todavía se advierte con criterio. No sé por qué. builder.greaterThanOrEqualsTo(root.get(Some_.date), date) <> builder.greaterThanOrEqualsTo(root.<Date>get(Some_.date), date)
    • Kwon: asegúrese de importar javax.persistence.criteria.Predicate, no java.util.function.Predicate. Que fijo que es para mí 🙂
    • No es una mala importar el problema, es un error, muy antiguo. para solucionarlo se debe declarar como una variable y utilizarla como un parámetro: Path path = root.get( .....); builder.greaterThan(path, date);
  2. 15

    Que usted necesita para utilizar el generado metamodelo para tener acceso a los atributos es realmente una manera segura. Si las Cadenas se utilizan para referirse a sus atributos, tipos sólo puede ser deducido a partir de la explícita de tipo genérico se utiliza cuando se llama al método, o por una conversión de tipo, o por el tipo automático de la inferencia realizada por el compilador:

    Path<Date> dateCreatedPath = root.get("dateCreated");
    predicates.add(builder.lessThanOrEqualTo(dateCreatedPath, dateLimit));
  3. 2

    Estaba recibiendo un error similar, pero con la sintaxis predicates.add(cb.greaterThan(article.get(Article_.created), since)); y encontré esta página. La causa para mí, resultó ser que yo había actualizado mi proyecto de Java 1.7 a 1.8, y en el proceso se había configurado Maven para compilar para Java 1.8 así. Simplemente he tenido que cambiar de Maven compila de nuevo a 1.7, manteniendo el resto del proyecto en el 1,8, para corregir el error.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea