2008-11-14 4 views
27

Khi bạn gán ngày cho một tham số SQL được đặt tên Hibernate sẽ tự động chuyển đổi nó thành giờ GMT. Làm cách nào để bạn sử dụng múi giờ máy chủ hiện tại cho tất cả các ngày?Cách gán tham số Ngày cho truy vấn Hibernate cho múi giờ hiện tại?

phép nói rằng bạn có một truy vấn:

Query q = session.createQuery("from Table where date_field < :now"); 
q.setDate("now", new java.util.Date()); 

"bây giờ" sẽ được thiết lập thành giờ GMT, trong khi "new Date()" được thời gian máy chủ hiện tại của bạn.

Cảm ơn.

Trả lời

57

Khi nó bật ra Hibernate không tự động chuyển đổi ngày thành GMT, nó chỉ cắt giảm thời gian nếu bạn sử dụng query.setDate(), vì vậy nếu bạn vượt qua "2009-01-16 12:13:14" nó sẽ trở thành "2009-01 -16 00:00:00 ".

Để dành thời gian xem xét bạn cần sử dụng query.setTimestamp("date", dateObj) để thay thế.

+1

Điều này chỉ là một chút tôi. Nó không giúp điều đó trong Oracle 'DATE' là ngày và giờ khớp với' Date' của Java trong khi 'TIMESTAMP' là một ngày và thời gian với micro giây. –

+0

Bây giờ, phương thức setTimestamp (String, Date) từ loại truy vấn không được chấp nhận – Maske

+0

Bạn đã lưu ngày của tôi, cảm ơn trước. – VAdaihiep

2

Hibernate không biết gì về múi giờ. Bất kỳ chuyển đổi múi giờ nào cũng phải được thực hiện trước khi thực hiện truy vấn.

Ví dụ: nếu máy chủ cơ sở dữ liệu của bạn được đặt thành CST, nhưng người dùng là EST, bạn sẽ cần thêm 1 giờ vào bất kỳ dấu thời gian nào là đầu vào cho truy vấn.

2

Chúng tôi sử dụng loại ngày Hibernate tùy chỉnh. Bất cứ khi nào chúng ta thiết lập một tham số trên một truy vấn, chúng ta sử dụng một lớp cơ sở hoặc phương thức tiện ích để chúng ta có thể chuyển múi giờ của người dùng thành tham số kiểu tùy chỉnh.

Bạn có thể nhận bằng cách điều chỉnh thủ công thời gian trong phương thức tiện ích cho truy vấn, nhưng cách ngày này được đọc hoặc ghi vào cơ sở dữ liệu cũng được chuyển đổi chính xác. Phương thức này cũng xử lý tình huống mà cơ sở dữ liệu lưu trữ ngày theo múi giờ địa phương của nó. Vì vậy, ngay cả khi bạn có người dùng trong một múi giờ, một máy chủ cơ sở dữ liệu ở một múi giờ khác và Java bằng cách sử dụng GMT, nó có thể nhận được mọi thứ ngay lập tức. Nó kết thúc lên trông giống như:

Properties properties = new Properties(); 
properties.setProperty("timeZone", databaseTimeZone); 
query.setParameter("from", dateEnteredByUser, Hibernate.custom(LocalizedDateType.class, properties)); 

Như một phần thưởng thêm, chúng tôi sử dụng điều này để đối phó với thực tế là SQL Server chuyển đổi 23: 59: 59.999 sang ngày hôm sau. Trong loại tùy chỉnh, chúng tôi kiểm tra và tắt nó đi.

2

Nếu bạn cần một thời gian thời gianZone được đồng bộ hóa, bạn có thể sử dụng ngay bây giờ() trong HQL của mình. Ngoài ra tôi đề nghị bạn sử dụng thư viện Joda. Nó có một mô-đun hibernate-plugin.