当前位置: 首页 > 知识库问答 >
问题:

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

樊奇思
2023-03-14

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

例如,(id=null, username='joe')和(id=1, username='joe')是两个不同的结果。在namedQuery中,如果id为null,语法为“u.idis 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;
}
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

    //抛出异常:不一致的数据类型:预期数为二进制

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

    //抛出异常:不一致的数据类型:预期数为二进制

    我也在namedQuery中尝试了nvl和解码,但没有成功。

    查询setParameter(“id”,id==null?-1:id)//不起作用。

    我的最后一个选择将是在用户文件中写入查询以替换用户文件中的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 ";
                }
        }
    
  • 共有3个答案

    邹华池
    2023-03-14

    如果查询末尾的是错误的,请尝试不使用它

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

    编辑

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

    query.setParameter("id", id == null ? -1 : id); 
    
    江鹏
    2023-03-14

    尝试让布尔值检查null。它对我有用。

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

    在命名查询中:

    (:idIsSet = false or id = :id)
    

    当id为null时,“idIsSet”为false。因此“:idIsSet=false”将变为true,并且不会检查id。

    后源
    2023-03-14

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

    有关在命名查询中使用什么,请参见以下答案。

       from CountryDTO c where 
        ((:status is null and c.status is null) or c.status = :status) 
        and c.type =:type
    
     类似资料:
    • 我是JPA新手,这里是我的一个查询,我有几个参数作为查询的一部分,任何参数都可以是空值

    • 这个问题已经问过了:Spring data-ignore参数,如果它有一个空值和一个创建的票证,datajpa-209。 只要这个问题是近3年前的问题,而且票证可以追溯到2012年,我就想问是否有一种更舒适和通用的方法来避免处理和复制存储库方法的开销。2个这样的参数的解决方案看起来是可以接受的,但是我想实现4-5个参数的非常相同的过滤。

    • 这可能只是一个简单的错误,我没有看到,但我认为我只是做错了什么。别担心,我没有在我的头函数中使用namespace std或任何似乎是这个人的问题[我读到的问题与我的类似][1][1]:为什么我会得到string不命名类型错误? 我现在有4个错误: C:\documents and settings\me\my documents\c++projects\c++\random句子\nouns.h8

    • XPath如何处理XML命名空间? 如果我使用 为了解析下面的XML文档,我得到了0个节点。 但是,我没有在XPath中指定名称空间(即不是路径的每个标记的前缀)。如果我没有明确告诉XPath,它怎么知道我想要哪个?我认为在这种情况下(因为只有一个名称空间),XPath可以完全忽略。但如果有多个名称空间,事情可能会变得糟糕。

    • 我是JPA新手,现在学习如何通过关系连接两个表。我得到的实体来自数据库。我有两张桌子,分别是Department和Employee。许多员工属于一个部门。 部门 雇员 多对一 错误

    • 问题内容: 我正在使用JPA,hibernate3。 当没有空值或空值时,此查询就像一个超级按钮。但是 traceEntityVO.getLotNumber(),traceEntityVO.getMfrLocId(),traceEntityVO.getExpDate()的 值可能为null或为空 。 在这种情况下,将针对变量而不是 null 条件来检查值’null’或’‘ 。当我不确定参数值是否为