0

階層がファーム -> フィールド -> リージョン グループ -> リージョンであり、ファーム、フィールド、およびリージョンの値に基づいてクエリを実行できる必要がある、一連の OneToMany アソシエーションを含むスキーマがあります。次の単純な構造が機能します。

org.hibernate.Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Farm.class)
  .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
  .add(Restrictions.in("id", farmIds))
  .createCriteria("fields").add(Restrictions.in("id", fieldIds))
  .createCriteria("regionGroups")
  .createCriteria("regions").add(Restrictions.in("nutrientId", nutrientIds));
return criteria.list();

しかし、フィルターで提供されている空のリストを考慮しようとすると、制限が適用されなくなり、すべての農場、畑、地域を含む結果セットが返されます。返された Criteria インスタンスの順序付けの問題だと確信していますが、さまざまな組み合わせを試してみて、どこにも速くならないことに苦労しています。私の正気を保つための提案はありますか?

org.hibernate.Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Farm.class)
  .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
if (!farmIds.isEmpty()){
  criteria.add(Restrictions.in("id", farmIds));
}
org.hibernate.Criteria fieldCriteria = criteria.createCriteria("fields");
if (!fieldIds.isEmpty()){
  fieldCriteria.add(Restrictions.in("id", fieldIds));
}
if (!nutrientIds.isEmpty()){
  fieldCriteria.createCriteria("regionGroups")
    .createCriteria("regions").add(Restrictions.in("nutrientId", nutrientIds));
}
return criteria.list();
4

0 に答える 0