我想将两个参数传递给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