1

假设我有一些类似于以下的类(为简洁起见,省略了 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;
       }
    }

使用休眠条件,我想运行一个查询,上面写着“给我所有具有空元数据或未启用元数据的记录”。目前我的代码执行以下操作:

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) 但这不起作用。我还尝试使用析取来通过我正在寻找的两个条件过滤我的结果(元数据为空,或未启用元数据)。这些方法都不起作用;我认为这是因为我正在尝试使用标准没有以我期望的方式加入。如果可以的话,请为我阐明这一点。

4

1 回答 1

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();
于 2012-08-15T16:01:00.117 回答