休眠标准

时间:2012-08-15 15:39:43

标签: java hibernate

假设我有类似下面的类(为了简洁省略了getters / setters)。

 public class Record{

        // ... properties
        private Metadata metadata;

        @OneToOne(cascade=CascadeType.ALL)
        @PrimaryKeyJoinColumn
        public Metadata getMetadata(){
            return metadata;
        }

    }


    public class Metadata {

       private Boolean enabled = false;

       private Record record;

       @OneToOne
       @PrimaryKeyJoinColumn
       public getRecord() {
           return record;
       }

       @Column("enabled")
       public Boolean getEnabled() {
           return enabled;
       }
    }

使用hibernate条件我想运行一个查询,其中显示“向我提供所有具有空元数据或未启用元数据的记录”。目前我的代码执行以下操作:

List results = session().createCriteria(Record.class).list();

// iterate over results, pluck out the Records that match my criteria

......但我们可以做得更好吗?

我尝试创建元数据的别名并尝试查看别名是否为空,或者alias.property是否与我的条件匹配即(Restrictions.eq(“metadata.enabled”,false)但不是我也尝试使用析取来按我正在寻找的两个条件来过滤我的结果(元数据为空,或者元数据未启用)。这两种方法都不起作用;我假设它是因为我正在尝试标准的做法并没有以我期望的方式加入。如果可以的话,请为我说清楚。

1 个答案:

答案 0 :(得分:2)

也许是这样的:

Criteria crit = session().createCriteria(Record.class);
crit.add( Restrictions.disjunction()
        .add( Restrictions.isNull("metadata") )
        .add( Restrictions.eq("metadata.enabled",  false) )
);
List results = crit.list();

或者这个:

List results = session().createCriteria(Record.class)
    .add( Restrictions.or(
        Restrictions.eq( "metadata.enabled", false ),
        Restrictions.isNull("metadata")
    )).list();