3

以前の質問の言い回しが悪かったのではないかと心配しているので、明確にするために新たに始めています。

各テーブル間に OneToMany 関連付けが存在する多数のテーブルを想像してください。Farm -> Field -> RegionGroup -> Region . Region.nutritionでフィルタリングする Criteria クエリを作成しようとしています。最上位レベルの属性でフィルタリングし、場合によっては次のレベルを下回っている人々の例をたくさん見てきましたが、4 層の深さでフィルタリングするときにクエリを作成する方法がわかりません。現時点ではこれがありますが、機能しません。

    Criteria criteria = getSessionFactory().getCurrentSession().createCriteria(Farm.class)
        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
        .setFetchMode("fields.regionGroups", FetchMode.JOIN)
        .setFetchMode("fields.regionGroups.regions", FetchMode.JOIN)
        .createCriteria("fields.regionGroups.regions").add(Restrictions.in("nutrient", nutrients));

何が起こるかというと、目的の結果を正しくカバーするプライマリ SQL クエリが生成されます (取得する必要があるデータのセットとまったく同じです)。ただし、返されたオブジェクトを反復処理すると、RegionGroup -> Regionの関連付けが制限を含まない各反復のサブクエリなので、 RegionGroup の値に関係なく、 RegionGroup のすべてのRegions取得ます。

select
    ...
from
    Farm this_ 
inner join
    Business business3_ on this_.BusinessID=business3_.BusinessID 
left outer join
    Field fields4_ on this_.FarmID=fields4_.FarmID 
left outer join
    RegionGroup regiongrou5_ on fields4_.FieldID=regiongrou5_.FieldID 
inner join
    Region region1_ on regiongrou5_.RegionGroupID=region1_.RegionGroupID 
where
    region1_.nutrient in ( ? ) 

-------------------------------------------

select
    ...
from
    Region regions0_ 
where
    regions0_.RegionGroupID=?

関連付けパス「fields.regionGroups.regions」に対して指定された制限を適用するには、何を追加する必要がありますか?

EDIT:次のHQLは私が求めていることを行いますが、私が求めている定義の柔軟性がないため、基準クエリに変換したいと思います。

from Farm as farm
  inner join fetch farm.fields as field
  inner join fetch field.regionGroups as regionGroup
  inner join fetch regionGroup.regions as region
where farm.id in :farmId 
  and field.id in :fieldId
  and region.nutrient in :nutrients

List<Farm>このように反復できる出力が得られます。

Farm [shortName=XYZ, name=XYZ]
   Field [shortName=COMM, name=Common]
      RegionGroup [indexNo=1]
         Region [nutrient=P, nutrientLevel=18.869684]
      RegionGroup [indexNo=2]
         Region [nutrient=P, nutrientLevel=18.836086]
      RegionGroup [indexNo=3]
         Region [nutrient=P, nutrientLevel=18.954369]

では、これを Criteria クエリとして指定するにはどうすればよいでしょうか。やりたいことを実行していることを証明するために、単純に HQL を変更して Region.nutrition の制限を削除すると、RegionGroup ごとにすべての Region が返されます。

from Farm as farm
  inner join fetch farm.fields as field
  inner join fetch field.regionGroups as regionGroup
  inner join fetch regionGroup.regions as region
where farm.id in :farmId 
  and field.id in :fieldId

結果を反復するコードに変更を加えることなく、次のようになりました。

Farm [shortName=XYZ, name=XYZ]
   Field [shortName=COMM, name=Common]
      RegionGroup [indexNo=1]
         Region [nutrient=Mg, nutrientLevel=108.84927]
         Region [nutrient=P, nutrientLevel=18.869684]
         Region [nutrient=pH, nutrientLevel=6.727207]
         Region [nutrient=K, nutrientLevel=189.04442]
      RegionGroup [indexNo=2]
         Region [nutrient=Mg, nutrientLevel=108.6944]
         Region [nutrient=pH, nutrientLevel=6.7214856]
         Region [nutrient=K, nutrientLevel=188.38605]
         Region [nutrient=P, nutrientLevel=18.836086]
      RegionGroup [indexNo=3]
         Region [nutrient=K, nutrientLevel=190.72464]
         Region [nutrient=pH, nutrientLevel=6.736169]
         Region [nutrient=P, nutrientLevel=18.954369]
         Region [nutrient=Mg, nutrientLevel=109.54382]
4

2 に答える 2

0

主な親エンティティの最初の ID と最も内側のエンティティの 2 番目の ID の 2 つのパラメータに一致する基準を使用して、第 3 レベルからオブジェクトのリストを取得するという同様の目標があります。これが質問です(申し訳ありませんが、元の質問にすばやく注意を向けて解決したかったので、回答セクションにしか追加できませんでしたが、プロフィールの評判が低いため、コメントとして投稿できませんでした)。ありがとう。

于 2015-03-15T11:16:19.313 に答える
0

はっきりさせておきます。返された のリストには、一部の とが入力Farmされているだけだと思いますか? RegionRegionGroup

言い換えれば、Farm2 つFieldの s があり、それぞれに 2RegionGroupがあり、それぞれに 2があり、探してRegionいる栄養素が 1 つしかないとします。Region's has the

クエリを実行すると、そのFarmインスタンスが返されます (必要に応じて、基準を満たします)。さて、そのインスタンスには、栄養素を含むField1RegionGroupと 1 の1 しかないと思いますか?Region

それはありません-起こり得ません。Hibernateは、オブジェクトのメモリ内表現が永続化された状態 (もちろん、フラッシュ後) と一致することを保証し、上記のようなことを行うことはその原則に反します。これが可能である場合、それを変更して保存することを決定した後はどうなりますFarmか? Hibernate は他のすべてのFields / etc... をデータベースから削除する必要がありますか?

これがあなたの求めているものでない場合は、質問を明確にしてください。

于 2011-08-04T17:55:24.500 に答える