関連する 2 つのエンティティの一部を次に示します。
実在物Trademark
public class Trademark extends AbstractEntity {
@OneToOne(mappedBy = "trademark", optional = false, cascade = CascadeType.MERGE)
private ReferenceNumber referenceNumber;
(...)
}
実在物ReferenceNumber
public class ReferenceNumber extends AbstractEntity {
@OneToOne(optional = true)
private Trademark trademark;
(...)
}
それでは、Criteria API を介して何かをフェッチしましょう。
protected Criteria createCriteria(SharedSessionContract session) {
Criteria criteria = session.createCriteria(Trademark.class);
criteria.createAlias("service", "s");
criteria.createAlias("referenceNumber", "rn", JoinType.INNER_JOIN);
criteria.add(Restrictions.eq("deleted", false));
criteria.add(Restrictions.in("service", createServiceList(getConfig().getServices())));
criteria.setMaxResults(1);
return criteria;
プロパティreferenceNumber
はフェッチされません - すべてのエンティティで null です。ただし、これは次のとおりです。
protected Criteria createCriteria(SharedSessionContract session) {
Criteria criteria = session.createCriteria(ReferenceNumber.class);
criteria.createAlias("service", "s");
criteria.createAlias("trademark", "t", JoinType.INNER_JOIN);
criteria.add(Restrictions.eq("t.deleted", false));
criteria.add(Restrictions.in("t.service", createServiceList(getConfig().getServices())));
criteria.setMaxResults(1);
return criteria;
}
うまく動作します。結果の正確な数を返します (はい、取得する前にそれらを数えています) が、ここではリレーションは正常に取得されます。どうして?2 番目の例のように H でプロパティを取得する方法。
編集:
Hによって生成された「実際の」SQLは実際には基準によって結合されているため、エンティティマッパーはここで彼の仕事をしていないと思います: inner join referencenumber rn2_ on this_.id=rn2_.trademark_id
->これreferenceNumber.id=trademark.id
で問題ありません。休止状態のバグ?