2017-07-10 3 views
0

次のコードを実行しています。その名前のhibernateパラメータ[<name>]は存在しません

UserService.java

String alias = "u"; 
String select = "SELECT u.email"; 
String where = "u.userId = :id"; 
Map<String, Object> params = new HashMap<>(); 
params.put("id", userId); 

List<User> users = db.findRecords(User.class, alias, select, where, params); 

DB.java

public <T> List<T> findRecords(Class<T> entityClass, String entityAlias, String select, String where, Map<String, Object> params) { 
    String sql = select + " FROM " + entityClass.getName() + " " + entityAlias; 

    if (where != null) { 
     sql = sql + " WHERE " + where; 
    } 

    Query query = entityManager.createQuery(sql); 
    System.out.println(sql); 
    if (!params.isEmpty()) { 
     Iterator<Entry<String, Object>> iterator = params.entrySet().iterator(); 
     while (iterator.hasNext()) { 
      Entry<String, Object> entry = iterator.next(); 
      System.out.println("key: " + entry.getKey() + ", value: " + entry.getValue()); 
      query.setParameter((String) entry.getKey(), (Long) entry.getValue()); 
     } 
    } 

    return query.getResultList(); 
} 

私は、次のエラー・ログを取得しています。

SELECT u.email FROM com.catalog.user.User u WHERE u.userId = :id 
key: id, value: 28636907 

Caused by: java.lang.IllegalArgumentException: Parameter with that name [id] did not exist 

パラメータがコンソールに表示されたら、不正な引数の例外が発生する原因は何ですか?

助けてください!

+0

クラス 'clues.catalog.user.User'はエンティティとして宣言されていますか? –

+0

はい。 import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Table; @Entity @Table(名= "cscart_users")を パブリッククラスユーザー{ \t @Column(名= "USER_ID") \t公衆ロングのuserId。 – Sid

+0

おそらく、文字列連結で何か問題が起こっている可能性があります。クエリでidパラメータを見つけることができないと言います... 正しい文字列で作成クエリを実行できますか? entityManager.createQuery( "SELECT u.email FROM clues.catalog.user.User u WHERE u.userId =:id"); – Zeromus

答えて

1

1)それは、パラメータ名:idのタイプミスではないことを確認してください。大文字と小文字を区別します。

2)パラメータなしでクエリを実行しようとします。エンティティマッピングの問題かもしれません。

3)HashMapを使わずにクエリで直接パラメータを設定しようとしました。

+0

ポイント2は間違っていました。他のエンティティには識別子が指定されていませんでした。一度それらのエンティティを削除すると、うまく動作し始めました! – Sid

0

ここでの問題は、Mapのパラメータを取得する方法によって発生したと考えられます。Map.entrySet()メソッドでは、反復値は反復内でのみ使用でき、その外側では未定義になりますループ中に印刷され、クエリには存在しません。

あなたはMap.entry documentationを見てみた場合、それは言う:

これらのMap.Entryオブジェクトのみ 反復の期間中有効です。その後

public <T> List<T> findRecords(Class<T> entityClass, String entityAlias, String select, String where, Long id){ 

私はあなたが保存する方法を変更し、パラメータを使用することを示唆している、あなたは、単にパラメータを格納するか、単にメソッドの呼び出しに直接idのparamを渡すためにList<Object>を使用することができます直接クエリでこの値を追加します。

query.setParameter("id", id); 
+0

キーと値を変数に格納しようとしましたが、どちらも機能しませんでした。また、すべてのタイプのクエリで共通の関数なので、関数にidパラメータを追加することはできません。 – Sid

関連する問題