【问题标题】:How to create Criteria on field that can be null?如何在可以为空的字段上创建条件?
【发布时间】:2012-04-11 19:29:34
【问题描述】:

我必须在特定字段 myProperity(在类 MyClass 上)创建 CriteriaCriterion。我必须选择所有具有 prop = null 或满足 特定条件 的对象。所以我应该做这样的事情:

Criteria criteria = this.sessionManager.getCurrentSession().createCriteria(MyClass.class);

specificCriteria = criteria.createCriteria('myProperity');
/* definition of specificCriteria */

Disjunction disjunction = Restrictions.disjunction();
disjunction.add(Restrictions.isNull('myProperity'));
disjunction.add(specificCriteria);

criteria.add(disjunction);

问题是由事实引起的:

  1. 我不能向 Disjunction 添加 Criteria(对 Disjunction 只能添加一个 Criterion),所以行: disjunction.add(specificCriteria);错了
  2. 我无法以某种方式修改特定标准,以接受 null,因为我无法为 null 制定标准。 (它给了我 NullPointerException)

你知道如何处理它吗?

【问题讨论】:

  • 析取是一个条件,因此您可以将其添加到条件中。
  • 是的,我漏掉了一行:criteria.add(disjunction);但事实并非如此。
  • 问题是我不能添加 Criteria do disjunction: disjunction.add(specificCriteria);

标签: hibernate hibernate-criteria


【解决方案1】:

你可以在这里得到所有问题的答案 这会帮助你

例如,如果您的 MyClass 喜欢

class MyClass{
   private long id;
   private String myProperity;
   .
   .
   .
   setter & getter
}

在这里,您的 null 问题已解决,这将与其他标准相匹配。

Criteria criteria = session.createCriteria(MyClass.class);

Disjunction disjunction = Restrictions.disjunction();
disjunction.add(Restrictions.isNull("myProperity"));

criteria.add(disjunction);

criteria.add(Restrictions.eq("id", value));

【讨论】:

    【解决方案2】:

    仅针对有此问题的其他人。我有一个类似的问题,我想检查关联的集合是否为空,以及是否不受 ID 限制。为了实现这一点,以下帮助了我(更新了更新版本的休眠代码):

    Criteria criteria = getSession().createCriteria(StaffMember.class);
    criteria.createAlias("franchises", "franchises", JoinType.LEFT_OUTER_JOIN)
            .add(Restrictions.or(
                    Restrictions.isEmpty("franchises"),
                    Restrictions.in("franchises.id", allowedFranchises)));
    

    所以这允许以下操作:

    1. 没有特许经营权的员工
    2. 拥有来自 allowedFranchises 集合的 ID 的加盟店员工

    【讨论】:

      【解决方案3】:

      这样的事情帮助了我:

      final Criteria c = session.createCriteria(House.class)
          // Houses may not have doors.
          .createAlias("door", "door", CriteriaSpecification.LEFT_JOIN)
          // Door may be null, but if it isn't it must be blue.
          .add(Restrictions.or(Restrictions.isNull("door"), Restrictions.eq("door.color", "blue")));
      

      这个答案帮助了我:https://stackoverflow.com/a/2208458

      【讨论】:

      • 这是用于 Hibernate 3 的答案,CriteriaSpecification 存在而 JoinType 不存在。
      【解决方案4】:

      通过检查isNull 来检查criteria 中提供的值是否为null,并按以下方式应用于您的criteria

      criteria.add(Restrictions.isNull("parentId"));
      

      【讨论】:

        【解决方案5】:

        Restrictions.eqOrIsNull(propertyName, value) 方法可用于处理空值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-16
          • 2020-01-14
          • 1970-01-01
          • 2011-10-11
          • 1970-01-01
          • 2020-06-26
          • 2021-04-24
          • 2012-05-20
          相关资源
          最近更新 更多