如何处理在JPA命名查询号码类型的空值(How to handle null value of nu

2019-10-21 05:13发布

我想传递两个参数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;
}
  1. 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;
    }
}

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

我曾尝试:

  1. 这是遗留代码,我不想改变结构。 所以我不希望使用标准。

  2. (:id为null或u.id =:ID)和u.username =:用户名从用户U选择其中ü

    //抛出异常:不一致的数据类型:预期数量有BINARY

  3. (:ID,NULL)和u.username =:用户名从用户U其中u.id = NULLIF选择ù

    //抛出异常:不一致的数据类型:预期数量有BINARY

  4. 我也试过NVL和解码的namedQuery,没有工作。

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

Answer 1:

你不能在运行时更改命名查询。 这样做会破坏命名查询的目的。 动态查询应使用标准的API来创建。

见这对在命名查询使用什么答案。

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


Answer 2:

尽量让一个布尔检查空。 它为我工作。

query.setParameter("idIsSet", id != null); 

query.setParameter("id", id); 

在命名查询:

(:idIsSet = false or id = :id)

当ID为空,“idIsSet”是假的。 所以“:idIsSet =假”变成真正的和ID将不检查。



Answer 3:

如果)在您的查询的末尾是一个错误,尝试没有它

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

编辑

如果一切都失败了,这种快速的解决方法应该这样做(如果你没有在数据库负IDS)在结合以上的空检查

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


文章来源: How to handle null value of number type in JPA named query