【问题标题】:CriteriaBuilder boolean comparisonCriteriaBuilder 布尔比较
【发布时间】:2012-08-19 17:07:07
【问题描述】:

我目前正在这样做。

final CriteriaBuilder builder = ...;
final boolean flag = ...;

if (flag) {
    builder.isTrue(expression);
} else {
    builder.isFalse(expression);
}

我可以这样用吗?

builder.equals(expression, flag);

这个试试不会有问题吧?为表达式或其他内容说 null。

【问题讨论】:

    标签: jpa criteria criteria-api


    【解决方案1】:

    我想你暗示使用CriteriaBuilder 的equal 方法。在这种情况下是的,您可以按如下方式使用它:

    builder.equal(expression, flag);
    

    这相当于:

    if (flag) {
      builder.isTrue(expression);
    } else {
      builder.isFalse(expression);
    }
    

    但请注意,如果您使用Hibernate 作为JPA 提供程序,则前一个实现将抛出NPE,以防expression==null 为真,而后一个不会。

    【讨论】:

    • 当使用 isTrue 或 isFalse 时,我看到 Hibernate 在我的查询中添加了一个 =1 。例如SELECT * FROM USER WHERE IS_ACTIVE = 1;无论如何,当使用 isTrue 时,我可以告诉 Hibernate 将该 =1 关闭,因为 mySQL 默认情况下会将布尔列视为 true ?当我有一个 1 秒的 SLA 时,这个额外的 =1 检查增加了超过 2 秒的查询时间。
    • 为了避免 NPE,你可以builder.equal(builder.coalesce(expression, false), flag);:这样 NULL 表达式将被视为 FALSE。
    猜你喜欢
    • 2016-05-13
    • 2019-05-28
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    相关资源
    最近更新 更多