Tại sao bạn sử dụng Restrictions.like(...
)?
Bạn nên sử dụng Restrictions.eq(...)
.
Lưu ý rằng bạn cũng có thể sử dụng .le
, .lt
, .ge
, .gt
trên các đối tượng ngày như các toán tử so sánh. LIKE
toán tử không thích hợp cho trường hợp này vì LIKE
rất hữu ích khi bạn muốn đối sánh kết quả theo từng phần nội dung của cột. Vui lòng xem http://www.sql-tutorial.net/SQL-LIKE.asp để tham khảo.
Ví dụ:nếu bạn có cột tên với tên đầy đủ của một số người, bạn có thể thực hiện where name like 'robert %'
để bạn sẽ trả lại tất cả các mục nhập có tên bắt đầu bằng 'robert '
(%
có thể thay thế bất kỳ ký tự nào).
Trong trường hợp của bạn, bạn biết toàn bộ nội dung của ngày bạn đang cố gắng khớp, vì vậy bạn không nên sử dụng LIKE
nhưng bình đẳng. Tôi đoán Hibernate không cung cấp cho bạn bất kỳ ngoại lệ nào trong trường hợp này, nhưng dù sao thì bạn có thể sẽ gặp vấn đề tương tự với Restrictions.eq(...)
.
Đối tượng ngày của bạn mà bạn nhận được với mã:
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
String myDate = "17-04-2011";
Date date = formatter.parse(myDate);
Đối tượng ngày này tương đương với ngày 17-04-2011 tại 0h, 0 phút, 0 giây và 0 nano giây.
Điều này có nghĩa là các mục nhập của bạn trong cơ sở dữ liệu phải có chính xác ngày đó. Ý tôi là nếu mục nhập cơ sở dữ liệu của bạn có ngày "17-April-2011 19:20:23.707000000", thì nó sẽ không được truy xuất vì bạn chỉ yêu cầu ngày đó:"17-April-2011 00:00:00.0000000000 ".
Nếu bạn muốn truy xuất tất cả các mục nhập trong cơ sở dữ liệu của mình từ một ngày nhất định, bạn sẽ phải sử dụng mã sau:
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-YYYY");
String myDate = "17-04-2011";
// Create date 17-04-2011 - 00h00
Date minDate = formatter.parse(myDate);
// Create date 18-04-2011 - 00h00
// -> We take the 1st date and add it 1 day in millisecond thanks to a useful and not so known class
Date maxDate = new Date(minDate.getTime() + TimeUnit.DAYS.toMillis(1));
Conjunction and = Restrictions.conjunction();
// The order date must be >= 17-04-2011 - 00h00
and.add( Restrictions.ge("orderDate", minDate) );
// And the order date must be < 18-04-2011 - 00h00
and.add( Restrictions.lt("orderDate", maxDate) );