私が扱っている次のオブジェクトがあります。
RawRead RawRead.Checkpoint
Checkpoint.EndCustomer
ガード
Checkpoint と Guard は RawRead のプロパティであり、EndCustomer は Checkpoint のプロパティです。すべてオブジェクトです。
私の現在のHibernateガビン:
Criteria crit = sess.createCriteria(RawRead.class);
crit.add(
Restrictions.or(
Restrictions.eq("checkpoint", null),
Restrictions.in("checkpoint.parentEndCustomer",collectionOfEndCustomers)
)
);
したがって、Checkpoint は null になる可能性がありますが、存在する場合は、parentEndCustomer オブジェクトが checkpoint.parentEndCustomer プロパティにある RawRead オブジェクトのみが必要です。
それが理にかなっていることを願っています。
上記の私の推測では、(私にとって) 私の基準が正しく指定されていないことを示唆するエラーが生成されます。
[Request processing failed; nested exception is org.hibernate.QueryException: could not resolve property: checkpoint.parentEndCustomer of: uk.co.romar.guardian.objects.RawRead] with root cause org.hibernate.QueryException:
could not resolve property: checkpoint.parentEndCustomer of: uk.co.romar.guardian.objects.RawRead at
org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81) at
org.hibernate.persister.entity.AbstractPropertyMapping.toColumns(AbstractPropertyMapping.java:96) at
org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:62) at
org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1457) at
org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:483)
RawRead の関連ビット:
@ManyToOne
@JoinColumn(name="CHECKPOINT_OID")
@NotFound(action=NotFoundAction.IGNORE)
public Checkpoint checkpoint = null;
public void setCheckpoint(Checkpoint in) {this.checkpoint = in;}
public Checkpoint getCheckpoint() {return this.checkpoint;}
@ManyToOne
@JoinColumn(name="GUARD_OID")
@NotFound(action=NotFoundAction.IGNORE)
private Guard guard = null;
public void setGuard(Guard in) {this.guard = in;}
public Guard getGuard() {return this.guard;}
そしてチェックポイントから:
@ManyToOne
@JoinColumn(name="ENDCUSTOMER_OID")
@NotFound(action=NotFoundAction.IGNORE)
private EndCustomer parentEndCustomer = null;
public EndCustomer getParentEndCustomer() {return this.parentEndCustomer;}
public void setParentEndCustomer(EndCustomer ownerCustomer) {this.parentEndCustomer = ownerCustomer;}
EDIT 以下からの最初の回答を実装した後に続きます。
データベースにこのようなデータがある場合 (表記が理にかなっていることを願っています!):
RawRead {
ID=1
checkpoint={id=1,parentEndCustomer={ID=1}}
}
RawRead {
ID=2
checkpoint={id=4,parentEndCustomer={ID=4}}
}
RawRead {
ID=3
checkpoint={id=7,parentEndCustomer={ID=31}}
}
RawRead {
ID=4
checkpoint={null}
}
制限で指定された collectionOfEndCustomers は次のようになります: EndCustomer={ID=31}
RawReads 3 と 4 のみを取得したいと思います。RawRead 1 と 2 は、子チェックポイント プロパティの parentEndCustomer が collectionOfEndCustomers の制限に渡されたものと一致しないため、拒否されます。
parentEndCustomer が渡されたコレクション内のものと一致するため、RawRead.3 を選択する必要があります。チェックポイントが null であるため、RawRead.4 を選択する必要があります。
以下の最初の回答のガイダンスに従うと、私が求めているサブセットではなく、上記のすべての RawReads が返されます。