1

次のようなクラスがあるとします (簡潔にするためにゲッター/セッターは省略されています)。

 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;
       }
    }

休止状態の基準を使用して、「null メタデータまたは有効になっていないメタデータを持つすべてのレコードを取得する」というクエリを実行したいと考えています。当分の間、私のコードは次のことを行います:

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

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

...しかし、もっとうまくやれるでしょうか?

メタデータのエイリアスを作成して、エイリアスが null かどうか、または alias.property が私の条件 (Restrictions.eq("metadata.enabled", false) など) に一致するかどうかを確認しようとしましたが、うまくいきません。また、私が探している2つの条件(メタデータがnullであるか、メタデータが有効になっていない)で結果をフィルタリングするために選言を使用しようとしました.これらのアプローチはどちらも機能しませんでした.基準でやろうとしていることが原因だと思います期待どおりに参加していません. できれば、これについていくつか説明してください.

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 に答える