2011-11-17 28 views
5

Tôi cần phải chọn một số thực thể sử dụng lọc HQL theo thời gian. Nhưng tôi chỉ cần so sánh thành phần ngày tháng mà không có thời gian. Ví dụ: 1.1.2011 12.00 và 1.1.2011 13.20 phải bằng nhau.Chỉ so sánh thành phần ngày trong HQL

Tôi có thể sử dụng toán tử nào?

@Query("FROM Item item " + 
    "WHERE item.date [equality by date operator] :date ") 
List<Item> findByDate(@Param("date") Date date); 

Trả lời

8

Nếu bạn không quan tâm đến các chức năng cụ thể DB, bạn có thể thực hiện việc này (sử dụng Oracle làm ví dụ).

@Query("FROM Item item WHERE trunc(item.date) = trunc(:date) ") 
List<Item> findByDate(@Param("date") Date date); 

Bạn có thể sử dụng điều này bởi vì các OracleDialect đăng ký trunc như một StandardSQLFunction và của Oracle TRUNC loại bỏ các thành phần thời gian của một ngày.

+0

Trong Oracle để tránh lỗi, bạn có thể gọi 'trunc (item.date, 'YYYY')' để tránh một số lỗi. –

9

Nếu bạn làm phiền các chức năng DB cụ thể (và bạn nên) sau đó làm việc với 2 ngày:

  1. kể từ ngày = ngày với thời gian thiết lập để nửa đêm
  2. để date = ngày với thời gian thiết lập để 23: 59: 59,999

sau đó truy vấn cho những ngày> = kể từ ngày và < = hẹn hò với

+0

Tôi đang sử dụng oracle db và nó tốt hơn cho tôi để sử dụng trunc. Tnx cho câu trả lời của chúng tôi – hatesms

+3

Tốt nhưng nếu bạn muốn thử nghiệm đơn vị với một DB trong bộ nhớ, nơi điều này không được hỗ trợ, bạn sẽ bị kẹt. –

0
"Select col from Table t where t.date = CURRENT_DATE()" 

hãy thử điều này.