2016-09-30 20 views
0

我正在使用命名查詢在日期字段上使用LIKE表達式執行查詢,如下所示;使用類似表達式的日期字段使用JPA 2.1

public Users getResultsByDate(Date regDate){ 
List<Users> dbUsers = new ArrayList<Users>(); 
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
Query searchQuery = getEntityManager().createNamedQuery("getUserByRegDate"); 
     searchQuery.setParameter("regDate", "%"+dateFormat.format(regDate)+"%"); 
try{ 
     dbUsers = searchQuery.getResultList(); 
    } 
catch(Exception ex){ 
     dbUsers = new ArrayList<Users>(); 
    } 
return dbUsers; 

}

在對應的類的名字的查詢;

@NamedQuery(name = "getUserByRegDate", query = "SELECT user FROM Users user WHERE user.regDate LIKE :regDate"), 

該查詢在使用以前的JPA 2.0版本。在JPA 2.1上運行時執行相同的錯誤時出現以下錯誤;

您曾試圖設定型類java.lang.String的值 參數:與類java.util.Date中的預期類型regDate ...

我該如何解決當在JPA 2.1上運行?它在JPA 2.0中運行正常。

+0

由於日期不是字符串(LIKE被定義爲要採用),你期望的是什麼? –

+0

@NeilStockton在JPA 2.0中完美工作。 – kabugima2

+0

'LIKE'用於字符串,不適用於日期(或數字) –

回答

0

嘗試使用本地命名查詢,將user.reg_date轉換爲字符串,然後將其與參數的運算符like進行比較。在Oracle DB的情況下這將是例如:

@NamedNativeQuery(name = "getUserByRegDate", query = 
    "SELECT user FROM Users user WHERE TO_CHAR(user.reg_date, 'DD-MON-YYYY') LIKE :regDate"), 
+1

感謝Boris,您的回答讓我朝着正確的方向前進。我已經使用了像這樣的NamedQuery; @NamedQuery(name =「getUserByRegDate」,query =「SELECT user FROM Users user WHERE FUNCTION('TO_CHAR',user.reg_date,'yyyy-MM-dd')LIKE:regDate」)。 – kabugima2

1

JPA規範4.6.10

對於使用比較操作符的語法[NOT] LIKE在 條件表達式如如下:

like_expression ::= 
string_expression [NOT] LIKE pattern_value [ESCAPE escape_character] 

的string_expression必須有一個字符串值。該pattern_value是 字符串文字或字符串值的輸入參數...

所以,不,它在JPA 2.0 「工作」;它是而不是任何JPA規範的一部分在LIKE表達式中使用Date。它可能只是偶然的工作,因爲一些JPA提供者(哪一個?)沒有執行檢查並強制執行JPA規範...

0

關鍵是使用DB函數'TO_CHAR'(ORACLE)或MySQL函數' date_format',那麼用戶FUNCTION IN @NamedQuery如下所示;

Oracle數據庫

@NamedQuery(name = "getUserByRegDate", query = "SELECT user FROM Users user WHERE FUNCTION('TO_CHAR',user.reg_date,'yyyy-MM-dd') LIKE :regDate") 

MySQL的

改變 'TO_CHAR' 上面 'DATE_FORMAT'

@NamedQuery(name = "getUserByRegDate", query = "SELECT user FROM Users user WHERE FUNCTION('date_format',user.reg_date,'%Y-%m-%d') LIKE :regDate") 

另見​​有關DATE_FORMAT MySQL的函數的詳細信息。 謝謝。

相關問題