我想將兩個參數傳遞給namedquery。一個是數字類型,另一個是字符串類型。他們都可能是空的。例如,(id = null,username ='joe')和(id = 1,username ='joe')是兩個不同的結果。在namedQuery中,如果id爲null,則語法爲「u.id is null」,但如果id不爲null,則爲「u.id =:id」。我的問題是如何動態處理namedQuery中的id字段?如何在JPA命名查詢中處理數字類型的空值
請檢查我的示例代碼:
1.User.java
@NamedQueries({
@NamedQuery(name = "getUser", query = "select u from User u"
+ " where u.id = :id"
+ " And u.username= :username")
})
public class User{
public Long id;
public String username;
}
- UserDao.java
這是遺留代碼,我不想改變結構。所以我不想使用Criteria。
從用戶U其中選擇U(:id爲null或u.id =:ID)和u.username =:用戶名
//拋出異常:不一致的數據類型:預期數量有BINARY
從用戶選擇U U其中u.id = NULLIF(:ID,NULL)和u.username =:用戶名
//拋出異常:不一致的數據類型:預期數量有BINARY
我也嘗試過nvl和解碼namedQuery,不起作用。
query.setParameter(「id」,id == null?-1:id)// did not work。
public User getUser(Long id, String username) {
TypedQuery<User> query = Dao.entityManager.createNamedQuery("getUser", User.class);
query.setParameter("id", id);
query.setParameter("username", username);
List<User> users = query.getResultList();
if (users.size() > 0) {
return users.get(0);
} else {
return null;
}
}
= ======================================
我曾嘗試:
我最後的選擇是在UserDao文件中寫入查詢來替換用戶文件中的namedQuery。
謝謝!
===========================================
我耗盡時間,不得不放棄使用namedQuery。我的解決辦法:
# UserDao.java
public User getUser(Long id, String usename) {
String getUser = "select u from user u where u.id " + Dao.isNull(id)
+ " And u.username " + Dao.isNull(username);
Query query = Dao.entityManager.createQuery(getUser);
}
# Dao.java
public static String isNull(Object field) {
if (field != null) {
if (field instanceof String) {
return " = " + "'" + field + "'";
} else {
return " = " + field;
}
} else {
return " is NULL ";
}
}
你確定問題出在參數上嗎?除了這個空的問題,查詢的工作原理和返回正確的結果? – 2014-10-30 15:44:58
不是,oracle不會將空字符串視爲空嗎? – zmf 2014-10-30 15:45:37
是的。這是空的問題。代碼之前工作正常。我剛剛得到了這個問題,因爲我們想改變id字段可能爲空的要求。以前,id字段是非空的。 – Bryan 2014-10-30 15:49:07