Sử dụng JPA 2 với triển khai EclipseLink.So sánh các đối tượng ngày trong API tiêu chí JPA
Tôi đang cố tạo một truy vấn động sẽ mang lại cho tôi một số bản ghi được lưu giữ sau một ngày cụ thể.
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()
và le()
là hai phương pháp duy nhất trong API mà trông giống như có thể giúp tôi trong trường hợp này. Cảnh báo này được thực hiện bởi nhật thực mặc dù:
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>>
Tôi có thể tưởng tượng rằng tôi không sử dụng đúng phương pháp cho vấn đề này nhưng tôi không thể tìm thấy bất kỳ đâu mẹo hoặc giải pháp có thể.
NetBeans 8.2 vẫn cảnh báo với tiêu chí. Tôi không biết tại sao. 'builder.greaterThanOrEqualsTo (root.get (Some_.date), date)' <> 'builder.greaterThanOrEqualsTo (root. get (Some_.date), date)' –
@Jin Kwon: Đảm bảo nhập 'javax.persistence .criteria.Predicate', không phải 'java.util.function.Predicate'. Điều đó cố định nó cho tôi :) – Hank
Không phải là một vấn đề nhập khẩu xấu, đó là một lỗi, một lỗi rất cũ. để giải quyết sự cố, bạn phải khai báo nó dưới dạng biến và sử dụng nó làm tham số: 'Đường dẫn đường dẫn = root.get (.....); builder.greaterThan (đường dẫn, ngày tháng); ' – FiruzzZ