2

Hibernateには、Criterionオブジェクトにエイリアスを追加する方法があります。使用できるものは次のとおりです。

多くのテーブルがある大きなデータベースから動的検索を行っています。検索には、clien側で選択された多くの(25以上の)オプションの非排他的パラメーターがあります。これには、管理性のためにHibernateCriteriaAPIを使用する必要があります。私のDAOには、次の方法があります。

Public List<myPojoClass> getDataByCriterion( List<Criterion> restrictionList) {
    Session s = HibernateUtil.currentSession(); 
    Criteria c = s.createCriteria(myPojo.class); 
    for (Criterion crit : restrictionList){     
        c.add(crit); 
    }  

List<myPojoClass> response = c.list(); 
return response;
}

myOtherPojo.classで結合を行う必要があり、上記の基準リストにエイリアスを追加できるかどうかを知りたいです。
のようなもの:

restrictionsList.add(... ...createAlias("myOtherPojo.class" , "mop");

次に、上記のように他の論理積をこのクラスに追加する必要があります。

4

2 に答える 2

4

またか!;)

エントリのコレクション (HashMap<String, String> など) を渡し、それらを繰り返し処理してエイリアスを設定できます...次のように:

Public List<myPojoClass> getDataByCriterion( List<Criterion> restrictionList, HashMap<String,String> aliases) {
Session s = HibernateUtil.currentSession(); 
Criteria c = s.createCriteria(myPojo.class); 
for (Criterion crit : restrictionList){     
    c.add(crit); 
}
for (Entry<String, String> entry : aliases.entrySet()){
    c.createAlias(entry.getKey(), entry.getValue());
}

List<myPojoClass> response = c.list(); 
return response;
}

フェッチモードを変更したい場合は、同様のことができます。もちろん、呼び出し元のメソッドは、エイリアスを適切に設定できるようにデータ モデルを認識している必要があります。そうしないと、実行時にエラーが発生する可能性があります。

于 2012-07-17T19:30:47.520 に答える
0

私が知っていることから、Criteriaのインスタンスなしで結合を作成する方法があります。必要に応じて基準とエイリアス定義を含む基準のラッパーを作成し、訪問者としてCriteriaを使用することをお勧めします(このパターンのように)

interface CriterionWrapper {
    void visit(Criteria c);
}
class OnlyCriterionWrapper implements CriterionWrapper {
    private Criterion c;
    public void visit(Criteria c){c.add(c);}
}
class CriterionWrapper implements CriterionWrapper{
    private Criterion c;
    private String whateverIsNeededToCreateAlias
    public void visit(Criteria c){
        c.createAlias(whateverIsNeededToCreateAlias); 
        c.add(c);
    }
}

次に、ListをパラメーターとしてgetDataByCriterion()メソッドに渡します

于 2012-07-17T19:23:56.613 に答える