2011-11-18 22 views
6

Dưới đây là một phiên bản tối thiểu của mã đó đã cho tôi rất nhiều thời gian để tìm hiểu xem tại sao nó không làm việc:HibernateException với setTimestamp nhưng làm việc với setParameter

Query q = session.createQuery(queryString); 
q.setTimestamp(0, new java.util.Date()); 

 

Các lỗi là:

Unset positional parameter at position: 0 

 

Khi tôi thay setTimestamp() với setParameter():

Query q = session.createQuery(queryString); 
q.setParameter(0, new java.util.Date()); 

 

Và nó làm việc, nhưng tôi không thể hiểu tại sao. Tôi đang sử dụng hibernate 3.2.1.

EDIT: Bài đăng có đề xuất khác đi đâu? Đây chính là nó!!

+0

chuỗi truy vấn của bạn trông như thế nào? – Casey

+0

Nó là ''từ các ứng dụng s trong đó s.validUntil giữa? Và?" '(HQL). Cả hai đã thực sự từ một đối tượng 'Calendar' bằng cách sử dụng' cal.getTime() 'nhưng để giữ nó đơn giản, tôi chỉ bao gồm một đối tượng' Date' trần. Lỗi vẫn giữ nguyên cả hai cách. – Raidok

Trả lời

1

Có câu trả lời ở đây trước đây được đề xuất sử dụng java.sql.Timestamp thay vì java.util.Date. Với sửa đổi nhỏ này, phương thức setTimestamp hoạt động như mong đợi.

+0

Dấu thời gian không được dùng nữa kể từ JDK 1.1 – abbas

0

Trong bản đồ của bạn, bạn có thể cần thêm chú thích sau vào biến của bạn cũng được giữ Timestamp

@Temporal(TemporalType.TIMESTAMP)

Đó có thể là lý do tại sao setParameter đang làm việc (nó chỉ mất một đối tượng) và setTimestamp không phải là .

+0

Tôi không nghĩ rằng đây là nó. Trường này đã nhập 'dấu thời gian'. Nếu không, tôi nghi ngờ nó sẽ làm việc với 'setParameter()' hoặc. – Raidok

+0

Không nhất thiết. Không có chú thích @Temporal, trường này được coi là DATE bởi Hibernate. Khi gọi setParameter, bạn liên kết một cá thể Date với một trường kiểu DATE. Mọi thứ ổn cả. Với setTimestamp, bạn liên kết một đối tượng Dấu thời gian với trường DATE. Đó không phải là điều tương tự. Bạn có ít nhất đã thử giải pháp này? –

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