2017-12-15 107 views
9

Tôi muốn sử dụng Hibernate current_timestamp() để viết dấu thời gian dựa trên thời gian cơ sở dữ liệu vào cột. Tôi muốn sử dụng thời gian cơ sở dữ liệu, không phải thời gian hệ thống của hệ thống dịch vụ của tôi sử dụng cơ sở dữ liệu. Tôi đang sử dụng thời gian cơ sở dữ liệu cho hai truy vấn, KhóaMở khóa.Tính thời gian với JPA hoặc truy vấn gốc

Khóa truy vấn

UPDATE MyEntity e SET e.lock = current_timestamp() WHERE e.id = :id

truy vấn Mở khóa

UPDATE MyEntity e SET e.lock = (current_timestamp() - "30 seconds") WHERE e.id = :id

phương sách cuối cùng của tôi là sử dụng một truy vấn bản địa cho PostgreSQL như thế này:

SELECT CURRENT_TIMESTAMP < (CURRENT_TIMESTAMP + INTERVAL '30 second')

Tôi không thể tìm tài liệu về cách thêm/bớt thời gian, nếu nó thậm chí còn được hỗ trợ. Làm cách nào để tôi có thể tạo truy vấn Mở khóa?

+2

Afaik không có hỗ trợ nào cho nó ... jpa 2.1 giới thiệu FUNC ('functionName', args) để gọi một hàm db cụ thể, nhưng nó vẫn rõ ràng là phụ thuộc vào db – Zeromus

+0

Chỉ cần lưu ý: bạn nên đặt cả dịch vụ và db để sử dụng Utc và tiết kiệm cho mình rất nhiều đau đầu – Zeromus

+0

Cảm ơn bạn. Chúng tôi đang sử dụng UTC ở khắp mọi nơi nhưng tôi vẫn lo lắng về các trường hợp khác nhau trên các đồng hồ khác nhau. – span

Trả lời

2

đặt giá trị mặc định của cột thành giá trị hiện tại (cơ sở dữ liệu cụ thể) của bạn. Với MySql, cột sẽ trông như thế này:

column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP 

Sửa

Dưới đây là một ví dụ (MySql) sẽ cập nhật các cột datetime mỗi khi hàng được cập nhật:

last_update DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
+0

Cảm ơn mặc dù tôi không chắc chắn cách thức này có thể được sử dụng để cập nhật hàng bằng truy vấn khóa/mở khóa. – span

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