2016-09-30 9 views
0

LIVE式を使用して日付フィールドにクエリを実行しようとしましたが、次のように名前付きクエリを使用しました。JPA 2.1を使用して日付フィールドにLike式を使用する

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.util.Dateクラスの予想されるタイプとregDate

を:あなたは パラメータの型クラスjava.lang.Stringの値を設定しようとしてきた

JPA 2.1で動作しているときJPA 2.0では正常に動作しています。

+0

日付は文字列ではありません(これはLIKEで定義されています)。正確に何を期待していますか? –

+0

@NeilStocktonはJPA 2.0で完全に動作します。 – kabugima2

+0

'LIKE'は文字列であり、日付(または数字)ではありません –

答えて

0

ネイティブの名前付きクエリを使用して、user.reg_dateを文字列に変換してから、演算子likeとパラメータと比較してみます。オラクル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 = "ユーザーユーザー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にない「仕事」をし...

リテラルや文字列の値を持つ入力パラメータ 文字列です。 LIVE式でDateを使用するJPA仕様の一部です。です。 JPAプロバイダ(一部は?)がJPA仕様をチェックして実施していないために、ちょうどうまくいったかもしれません...

0

キーは、DB関数 'TO_CHAR'(ORACLE)またはMySQL関数 ' date_format 'と入力し、次に示すようにFUNCTIONを@NamedQueryに入れます。 'DATE_FORMAT'

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

に上記

ORACLE DB

@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 MySQLの機能に関する詳細は​​を参照してください。おかげさまで

関連する問題