Uso de JPA 2 con implementación de EclipseLink.Comparar entidades de fecha en los criterios de JPA API
Estoy tratando de crear una consulta dinámica que debería traer algunos registros persistentes después de una fecha determinada.
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 en la API, que se parecen a mí puede ayudar en este caso. Esta advertencia es arrojado por el eclipse sin embargo:
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>>
puedo imaginar que no estoy tomando el enfoque correcto para este problema, pero no puedo encontrar en cualquier lugar algunos consejos o sugerencias para una posible solución.
NetBeans 8.2 todavía advierte con criterios. No sé por qué. 'builder.greaterThanOrEqualsTo (root.get (Some_.date), date)' <> 'builder.greaterThanOrEqualsTo (root . get (Some_.date), date)' –
@Jin Kwon: asegúrese de importar 'javax.persistence .criteria.Predicate', not 'java.util.function.Predicate'. Eso lo solucionó :) – Hank
No es un problema de importación, es un error, muy antiguo. para solucionarlo, debe declararlo como una variable y usarlo como parámetro: 'Path path = root.get (.....); builder.greaterThan (ruta, fecha); ' – FiruzzZ