2013-08-29 60 views
11

Có cách nào để đặt điều kiện phạm vi ngày tham chiếu đến thời gian hiện tại trong truy vấn JPA (tương thích trên cơ sở dữ liệu) không?Làm cách nào để truy vấn "cũ hơn ba phút" trong JPA?

tôi có thể làm

SELECT m FROM Mail m WHERE m.sentAt < :date 

nhưng tôi muốn làm điều đó mà không cần phải ràng buộc một tham số (vì vậy mà điều này có thể được cấu hình như một phần của kho lưu trữ truy vấn có tên và logic tính ngày không phải nhập mã gọi).

Vì vậy, thay vì :date Tôi cần "currentTime minus 3 minutes" dưới dạng chữ viết cứng.

+0

Câu hỏi liên quan này dường như gợi ý rằng bản thân JPA không thực hiện các phép tính ngày, nhưng có thể thực hiện cụ thể. Tôi sẽ ổn với phiên bản Hibernate. http://stackoverflow.com/questions/4105946/jpql-and-date-comparison-constraint-in-the-query?lq=1 – Thilo

Trả lời

3

JPA hỗ trợ các hàm CURRENT_TIMESTAMP và CURRENT_TIME.

https://en.wikibooks.org/wiki/Java_Persistence/JPQL#Functions

Các JPA spec không có chức năng cập nhật, nhưng một số nhà cung cấp JPA như EclipseLink làm.

http://java-persistence-performance.blogspot.com/2012/05/jpql-vs-sql-have-both-with-eclipselink.html

JPA 2.1 cũng định nghĩa các nhà điều hành CHỨC NĂNG để gọi chức năng cơ sở dữ liệu.

Trong EclipseLink tôi sẽ cố gắng,

SELECT m FROM Mail m WHERE m.sentAt < SQL("(sysdate - interval '3' minute)") 

hay,

SELECT m FROM Mail m WHERE m.sentAt < SQL("(? - interval '3' minute)", CURRENT_TIMESTAMP) 
+0

Dấu ngoặc kép không chính xác và phải được thay thế bằng dấu nháy đơn. – tak3shi

1

Nếu bạn đang sử dụng Hibernate JPA thực hiện và một Oracle phương ngữ, sau đó bạn có thể sử dụng SYSDATE chức năng mà trả về ngày giờ hiện tại. Nếu bạn thêm 1 đến SYSDATE, nó sẽ thêm một ngày.

phân Thêm cũng được hỗ trợ:

  • sysdate + 1/24 sẽ thêm một giờ
  • sysdate + 1/(24*60) sẽ thêm một phút
  • sysdate + 1/(24*60*60) sẽ thêm một giây

Vì vậy, thay vì: ngày Tôi cần "currentTime trừ 3 phút" dưới dạng chữ viết cứng.

sysdate - 3/(24*60) sẽ trừ từ ngày giờ hiện tại 3 phút:

SELECT m FROM Mail m WHERE m.sentAt < sysdate - 3/(24*60) 

ghi lớn hơn 3 phút sẽ được trả lại và không có tham số ràng buộc là cần thiết.

+1

Nó chỉ hoạt động cho phương ngữ ORACLE hay MYSql? –