Использование JPA 2 с реализацией EclipseLink.Сравнение объектов даты в JPA Критерии API
Я пытаюсь построить динамический запрос, который должен принести мне некоторые записи, сохраненные после определенной даты.
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()
и le()
являются только два метода в API, которые выглядят, как может мне помочь в этом случае. Это предупреждение брошено затмение, хотя:
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>>
Я могу себе представить, что я не беру правильный подход к этой проблеме, но я нигде не могу найти некоторые советы или указатели для возможного решения.
NetBeans 8.2 по-прежнему предупреждает с помощью критериев. Я не знаю почему. 'builder.greaterThanOrEqualsTo (root.get (Some_.date), date)' <> 'builder.greaterThanOrEqualsTo (root. get (Some_.date), date)' –
@Jin Kwon: Обязательно импортируйте 'javax.persistence .criteria.Predicate', а не 'java.util.function.Predicate'. Это исправило это для меня :) – Hank
Неплохая проблема с импортом, это ошибка, очень старая. , вы должны объявить его как переменную и использовать его как параметр: 'Path path = root.get (.....); builder.greaterThan (путь, дата); ' – FiruzzZ