0

私が扱っている次のオブジェクトがあります。

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 が返されます。

4

1 に答える 1

2

HQL のようにプロパティをチェーンすることはできません。条件付きで結合を使用する必要があります。また、チェックポイントが null になる可能性があるため、左結合を使用する必要があります。さらに、Restrictions.eq()何かを比較するために使用することはできませんnull(HQL や SQL のように)。そのために使用する必要がありますRestrictions.isNull()

したがって、クエリは次のようになります。

Criteria crit = sess.createCriteria(RawRead.class, "rawRead");
crit.createAlias("rawRead.checkpoint", "checkpoint", Criteria.LEFT_JOIN)
crit.add(
    Restrictions.or(
        Restrictions.isNull("checkpoint.id"),
        Restrictions.in("checkpoint.parentEndCustomer", collectionOfEndCustomers)
    )
);
于 2012-07-25T16:45:45.437 に答える