我想将两个参数传递给namedquery。一种是数字类型,另一种是字符串类型。它们都可以为空。
例如,(id=null, username='joe') 和 (id=1, username='joe') 是两个不同的结果。在namedQuery中,如果id为null,则语法为“u.id is null”,但如果id不为null,则语法为“u.id = :id”。我的问题是如何动态处理namedQuery中提交的id?
请检查我的示例代码:
1.用户.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;
}
}
=========================================
我尝试过的:
这是遗留代码,我不想更改结构。所以我不想使用标准。
-
从用户 u 中选择 u,其中(:id 为 null 或 u.id= :id)且 u.username= :username
// 抛出异常:数据类型不一致:期望 NUMBER 得到 BINARY
-
从用户 u 中选择 u,其中 u.id= nullif(:id, null) 且 u.username= :username
// 抛出异常:数据类型不一致:期望 NUMBER 得到 BINARY
我还在namedQuery中尝试了nvl和decode,但没有成功。
query.setParameter("id", id==null?-1:id) // 不起作用。
我的最后选择是在 UserDao 文件中编写查询来替换 User 文件中的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 ";
}
}