2009-12-04 34 views
8

Tôi chắc chắn rằng một người quen thuộc với HQL (tôi là bản thân mình là một newbie) có thể dễ dàng trả lời câu hỏi này.Làm thế nào để truy vấn một ngày trong HQL (Hibernate) với Joda Time?

Trong ứng dụng Grails của tôi, tôi có lớp miền sau.

class Book { 
    org.joda.time.DateTime releaseDate //I use the PersistentDateTime for persisting via Hibernate (that use a DATETIME type for MySQL DB) 
} 

Trong truy vấn HQL của tôi, tôi muốn lấy cuốn sách mà ngày phát hành được bao gồm trong phạm vi date1 .. date2

Ví dụ tôi đã cố gắng:

DateTime date1, date2 
... 
def queryStr = "select * from Book as b where b.releaseDate > $date1 and b.releaseDate < $date2" 
def res = Book.executeQuery(queryStr) 

Nhưng tôi có những ngoại lệ ...caused by: org.springframework.orm.hibernate3.HibernateQueryException: unexpected token: Mã thông báo lỗi trỏ đến định dạng ngày (ví dụ: 2009-11-27T21:57:18.010+01:00 hoặc Fri Nov 27 22:01:20 CET 2009)

Tôi cũng đã cố chuyển đổi date1 thành một lớp Ngày không thành công

Vì vậy, mã HQL chính xác là gì? Tôi có nên chuyển đổi sang một định dạng cụ thể (cái nào?) Bằng cách sử dụng phương thức patternForStyle hoặc có cách nào khác để làm điều đó không?

Xin cảm ơn,

Fabien.

+0

Bản đồ org.joda.time.DateTime vào SQL của bạn như thế nào? Có phải nó trực tiếp đến lĩnh vực này? java.util.Date và java.util.Calendar có thể ánh xạ trực tiếp đến một trường cơ sở dữ liệu. Đối với những gì nó có giá trị, vì DateTime là một đối tượng tổng hợp, plugin Grails có thể sử dụng dưới dạng bao trùm một kiểu ánh xạ tùy chỉnh (xem giây 5.3 của Java Persistence with Hibernate). – Alan

+0

Như đã nêu trong nhận xét của mã, DateTime đang sử dụng loại ánh xạ PersistentDateTime tùy chỉnh từ thư viện joda-time-hibernate – fabien7474

Trả lời

7

Tôi không phải chuyên gia Grails, nhưng trong java bạn thường làm date1date2 tham số truy vấn và ràng buộc đối tượng này như:

String hql = "select * from Book as b where b.releaseDate > :date1 and b.releaseDate < :date2"; 
session.createQuery(hql).setDate("date1", date1).setDate("date2", date2).list(); 

tôi chắc chắn rằng bạn có thể làm điều gì đó tương tự trong Grails. Nếu không, định dạng ngày tháng của bạn là yyyyMMddhhmmss (không có dấu cách) và kèm theo chúng trong dấu nháy đơn - theo cách đó Hibernate sẽ coi chúng là hằng số và MySQL sẽ ngầm chuyển chúng thành ngày tháng.

+0

Cảm ơn rất nhiều !! Sau khi trả lời của bạn, tôi đã đi vào mã nguồn grails và tìm thấy điều này để thực hiện truy vấn HQL: Account.executeQuery ("select a.number khác biệt từ Tài khoản a trong đó a.branch =: branch ", [branch: 'London']) Vì vậy, tôi đã làm tương tự cho kịch bản của tôi và nó đã làm việc Thx. – fabien7474

5

Tôi chỉ ra bởi ChssPly, bạn nên khai báo date1date2 làm tham số truy vấn (vị trí hoặc tên) và sau đó liên kết chúng. Ở đây, chúng ta sẽ sử dụng các tham số có tên. Cách thông thường để vượt qua tham số truy vấn tên với Grails là thông qua một Map:

def queryStr = "from Book b where b.releaseDate > :date1 and b.releaseDate < :date2" 
Book.executeQuery(queryStr, [date1: date1, date2: date2]) 

Kiểm tra executeQuery() tài liệu cho các chi tiết cú pháp của cả hai lựa chọn.

+0

Hi Pascal Thx để được giúp đỡ của bạn. Tôi đã làm chính xác những gì bạn đã viết. – fabien7474

3

Bạn cũng có thể so sánh số ngày sử dụng định dạng ngày ISO8601 ví dụ:

select * from Book as b 
where b.releaseDate > '2009-11-27T21:57:18.010+01:00' 
and b.releaseDate < '2010-11-27T21:57:18.010+01:00' 

Tôi đã thử nghiệm này sử dụng MySql như back-end. Chỉ cần nhớ tóm tắt ngày tháng thành chuỗi.

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