【问题标题】:Criteria API find 'NULL'标准 API 找到“NULL”
【发布时间】:2013-08-14 18:56:48
【问题描述】:

以下是从更大的 Criteria Query 中摘录的:

...
Expression literal = builder.literal((String) "%" + value + "%");

List<Predicate> globalPredicate = new ArrayList<>();

globalPredicate.add(builder.equal(subject.get(Subject_.email), literal));

predicates.add(builder.or(globalPredicate.toArray(new Predicate[globalPredicate.size()])));  
...

存在一个条件,即我明确想要传入null 并找到Subject_.emailnull。我尝试传入null,发现标准API 需要一个nullLiteral()。我尝试在适当的时候用 nullLiteral() 有条件地替换 literal,但后来我什么也没得到。

创建将匹配数据库中指定属性的null 值的查询的最佳实践方法是什么?

【问题讨论】:

    标签: jpa null criteria-api


    【解决方案1】:

    我通常使用Expression#isNull()。使用您的示例:

    globalPredicate.add(subject.get(Subject_.email).isNull());
    

    至于这是否被认为是“最佳实践”,在 Oracle 的 Java EE 教程40.3.5.1 The Expression Interface Methods 中进行了演示。

    【讨论】:

    • 好的,但null 不是强制性的,它是一个可选值。其余时间我需要传递一个文字。所以你是说如果我检测到null 值,最好的方法是有条件地在我的陈述和你的陈述之间切换。
    • 是的,这就是我的建议。我怀疑在传入的值为null 的情况下,其他方法会被翻译成类似于email = NULLwhich is not what you want 的内容。您可以通过检查生成的本机查询来验证这一点。
    【解决方案2】:

    Null 或 NotNull 可以在条件查询中使用,如下所示:

    // IS [NOT] NULL
        Predicate n1 = cb.isNull(name);
        Predicate n2 = cb.isNotNull(name);
    

    使用此链接作为参考:http://www.objectdb.com/java/jpa/query/jpql/comparison

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 2016-12-31
      • 1970-01-01
      • 2017-11-29
      相关资源
      最近更新 更多