有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

HQL表达式中的java Null

我想知道HQL表达式是否是空安全的? 例如,考虑这个命名查询

SELECT a
FROM A a
where a.f=:f

其中f是字符串、双精度、日期等类型的字段。 然后我使用它,就像:

session.getNamedQuery("myNamedQuery").setString("f", myFValue).uniqueResult();

如果a.f和myFValue都为null,我希望条件为true,如果其中只有一个为null,我希望条件为false

如果它不是空安全的,我如何处理它

问候


共 (5) 个答案

  1. # 2 楼答案

    它们不是零安全的。使用这些标准就可以做到这一点

    public static void addNullSafeEqualsRestriction(Criteria criteria, String propertyName, Object object) {
        if (object == null) {
            criteria.add(Restrictions.isNull(propertyName));
        } else {
            criteria.add(Restrictions.eq(propertyName,object));
        }
    }
    
  2. # 3 楼答案

    事实并非如此。尝试以下场景来处理您的具体案例:

    select a from A a where ((:f is null and a.f is null) or a.f = :f) and ...

    如果参数字符串为null,那么查询将检查行的状态是否也为null。否则,它将求助于与等号进行比较

    如果需要跳过:status where_子句;您可以这样编写代码:

    select a from A a where (:f is null or a.f = :f) and ...

    第二个查询相当于:

    if(status != null){
      sql.append(" a.f = :f and ");
    }
    
  3. # 4 楼答案

    不,它们不安全。它们被直接转换为SQL,并遵循相同的规则。所以如果你想测试null,你必须使用is [not] null

    因此,如果f参数可以为null,则必须使用两个不同的HQL查询,或者动态地构建它,或者使用条件查询来构建动态查询

  4. # 5 楼答案

    它们不是空安全的

    HQL将HQL查询转换为SQL,然后替换参数。所以它不会重写param=?to param为空

    选择Criteria API并使用Restrictions.isNull("f");