我想传递两个参数namedquery。 一个是数字型,另一种是字符串类型。 他们都可能为空。
例如,(ID =空,用户名= '乔')和(ID = 1,用户名= '乔')是两个不同的结果。 在namedQuery,语法是 “u.id为空”,如果id为null,但 “u.id =:ID” 如果ID不为空。 我的问题是如何动态处理在namedQuery提交的ID?
请检查我的示例代码:
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
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;
}
}
=======================================
我曾尝试:
这是遗留代码,我不想改变结构。 所以我不希望使用标准。
(:id为null或u.id =:ID)和u.username =:用户名从用户U选择其中ü
//抛出异常:不一致的数据类型:预期数量有BINARY
(:ID,NULL)和u.username =:用户名从用户U其中u.id = NULLIF选择ù
//抛出异常:不一致的数据类型:预期数量有BINARY
我也试过NVL和解码的namedQuery,没有工作。
query.setParameter( “ID”,ID == NULL -1:ID)//没有工作。
我最后选择将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 ";
}
}