2017-07-10 35 views
0

我正在運行下面的代碼。具有該名稱的休眠參數[<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公共龍用戶id; – 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得到PARAMS的方式造成,與Map.entrySet()方法問題的迭代值僅在迭代內可用,並且將它的外面是不確定的,這就是爲什麼參數是正確的在循環中打印並且不存在於查詢中。

如果你看一看的Map.entry documentation它說:

這些Map.Entry對象只適用於該 迭代的持續時間;

我建議你改變你的存儲和使用方式的參數,可以簡單地用一個List<Object>存儲參數,或直接通過id PARAM在方法調用:

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

然後在查詢中直接添加該值:

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

我嘗試將變量中的鍵值和值存儲起來,但這也不起作用。我不能在函數中添加id參數,因爲它是所有類型查詢的常用函數。 – Sid