2

ここで、休止状態の基準の使用で問題に直面しています。複数のテーブルの基準を作成し、制限を追加しましたが、出力が期待どおりではありません

私のコード:

final Criteria crit = session2.createCriteria(Item.class, "item");   
            crit.createCriteria("itemvalues", "values");   
            crit.createCriteria("categoryitemses", "catItems");   
            crit.createCriteria("catItems.category", "cat");   
            crit.createCriteria("cat.categorytype", "catType");    
            crit.createCriteria("cat.categoryproducts", "catProd");    
            crit.createCriteria("catProd.product", "prod");    
            crit.createCriteria("prod.customer", "cust");   
            crit.add(Restrictions.eq("catType.id", id));   
            crit.add(Restrictions.eq("cust.id", custId));   
            crit.add(Restrictions.eq("values.inputkey", "previewimage"));   
            crit.addOrder(Order.asc("item.id"));

Item.java には、次のプロパティがあります。

private Itemtype itemtype;   
private String name;   
private String description;   
private Set<Itemvalue> itemvalues = new HashSet<Itemvalue>(0);   
private Set<Categoryitems> categoryitemses = new HashSet<Categoryitems>(0); 

ItemValue テーブルには、previewimage や content などのエントリを含むフィールド名 inputkey が含まれていますが、必要なのは previewimage inputkeys を取得することだけです。

しかし、出力 inputkeys には他の値も含まれています。

休止状態によって生成されたクエリが正しく実行され、期待どおりの出力が得られることがわかりましたが、その後、セットを使用して itemvalue を取得すると、他のいくつかのクエリも実行されます。

final Set<Itemvalue> itemValues = itemList.get(innerIndex).getItemvalues();   
final Iterator<Itemvalue> itemVals = itemValues.iterator();    
while(itemVals.hasNext()) {   
jobj.put("Location", itemVals.next().getValue());    
}

ここで itemValues.iterator の hibernate クエリは 17 回実行されました。これは、全体の出力が 17 アイテムであり、各アイテムが itemvalue をフェッチするが、前に指定された条件が省略されているためです。

crit.add(Restrictions.eq("values.inputkey", "previewimage")); 

ここで何が欠けていますか?誰でもこれを解決するのを手伝ってください!

前もってありがとう、
カーティ。

4

1 に答える 1

1

元のクエリでは、この制限を使用して、オブジェクトではなくオブジェクトRestrictions.eq("values.inputkey", "previewimage")を除外しています。ItemItemvalue

getItemvalues()呼び出されると、元のクエリではなくオブジェクトを取得するために Hibernate コレクション マッピングが使用されます。コレクション マッピングについて特別なことがなければ、関連する項目値オブジェクトのフィルター処理されていないコレクションが返されます。

コレクション マッピングでフィルターを構成するか、各アイテムに対して新しい基準を実行して、フィルター処理された目的の itemvalue コレクションを取得することができます。

于 2012-08-08T12:49:30.070 に答える