2012-08-15 170 views
0

假设我有类似于下面的类(为了简洁省略了getter/setter)。休眠标准

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

也许是这样的:。

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(); 
+0

是的,这是我最初的实现。这没有奏效。如果人们可以告诉我,这当然是正确的做法,那么我的问题一定是其他地方。 – zmf 2012-08-15 16:05:38

+0

当使用DetachedCriteria(与spring)时,我个人遇到了嵌套属性的问题。没有弄清楚问题是什么......我必须创建“根植于”特定实体的子标准,以进一步过滤。 – Less 2012-08-15 16:09:50