如何在JPA命名查询中处理数字类型的空值

我想将两个参数传递给namedquery。 一个是数字类型,另一个是字符串类型。 它们都可以为空。

例如,(id = null,username =’joe’)和(id = 1,username =’joe’)是两个不同的结果。 在namedQuery中,如果id为null,则语法为“u.id为null”,如果id为非null,则为“u.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; } 
  1. UserDao.java
 public User getUser(Long id, String username) { TypedQuery query = Dao.entityManager.createNamedQuery("getUser", User.class); query.setParameter("id", id); query.setParameter("username", username); List users = query.getResultList(); if (users.size() > 0) { return users.get(0); } else { return null; } } 

=======================================

我试过的:

  1. 这是遗留代码,我不想更改结构。 所以我不想使用Criteria。

  2. 从User u中选择你的地方(:id为null或u.id =:id)和u.username =:username

    //抛出exception:不一致的数据类型:预期NUMBER得到了BINARY

  3. 从用户u中选择u,其中u.id = nullif(:id,null)和u.username =:username

    //抛出exception:不一致的数据类型:预期NUMBER得到了BINARY

  4. 我也试过nvl并在namedQuery中解码,没用。

  5. 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 "; } } 

您无法在运行时更改命名查询。 这样做会破坏命名查询的目的。 应使用条件api创建动态查询。

请参阅此答案,了解在命名查询中使用的内容。

  from CountryDTO c where ((:status is null and c.status is null) or c.status = :status) and c.type =:type 

如果在查询结束时出现错误,请尝试不使用它

  @NamedQuery(name = "getUser", query = "select u from User u" + " where (:id is null or u.id = :id)" + " And :username" 

编辑

如果其他一切都失败了,这个快速的解决方法应该与上面的null检查结合使用(如果你没有数据库中的负数id)

 query.setParameter("id", id == null ? -1 : id);