2012-03-08 26 views
21

Vì vậy, tổ chức của tôi có:Chọn MAX timestamp với Tiêu chuẩn JPA2 API

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

metamodel tạo của tôi có:

public static volatile SingularAttribute<MyEntity,Timestamp> timestamp; 

Tôi muốn chọn bởi giá trị Max Timestamp:

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

Nhưng tôi không được phép vì:

max(Expression<N> x) Tạo biểu thức tổng thể áp dụng thao tác tối đa bằng số. <N extends java.lang.Number> Biểu

Tất nhiên Timestamp không mở rộng Number.

Làm cách nào để tôi có thể thực hiện MAX trên cột Timestamp bằng API tiêu chí an toàn loại?

Cảm ơn.

Trả lời

39

Thay vì tối đa bạn phải sử dụng CriteriaBuilder.greatest cho dấu thời gian (và cho ngày, chuỗi và các lần so sánh khác). Và nếu bạn cần MIN cho Dấu thời gian, thì hãy sử dụng phương pháp ít nhất thay vì

Loại tương tự có thể phải đối mặt với các so sánh ít hơn/lớn hơn/bằng nhau. Firs một chấp nhận lập luận cho rằng mở rộng Number, thứ hai là cho pháp so sánh khác:

  • lt vs lessthan
  • le vs lessThanOrEqualTo
  • ge vs greaterThanOrEqualTo
  • gt vs greaterThan
+1

Cảm ơn Mikko - Tôi đã bỏ lỡ điều đó trong tài liệu API. – planetjones

+0

sub.where (cb.greatest (histories.get ("activeDate"))); [ERROR] bắt buộc: javax.persistence.criteria.Expression [ERROR] được tìm thấy: javax.persistence.criteria.Path [LRI] lý do: loại suy ra không phù hợp với giới hạn trên (s)) –

Các vấn đề liên quan