如何在字段上创建可以为null的Criteria?

时间:2012-03-28 08:16:54

标签: hibernate hibernate-criteria

我必须在特定字段 myProperity (在课程 MyClass 上)创建条件标准。我必须选择 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. 我无法添加Criteria to Disjunction(对于Disjunction只能添加一个Criterion),所以line:disjunction.add(specificCriteria);是错的
  2. 我无法以某种方式修改specificCriteria,接受null因为我无法在null上制作条件。 (它给了我NullPointerException)
  3. 你有什么想法如何处理它?<​​/ p>

5 个答案:

答案 0 :(得分:10)

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

如果你的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));

答案 1 :(得分:7)

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

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 collection的ID的特许经营的员工

答案 2 :(得分:6)

这样的事情对我有所帮助:

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

答案 3 :(得分:1)

通过检查criteria检查null中提供的值是否为isNull,并按照以下说明将其应用于您的criteria

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

答案 4 :(得分:0)

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