質問

たとえば私のような何かをする場合:

Criteria c = session.createCriteria(Book.class)
             .add(Expression.ge("release",reDate);
             .add(Expression.ge("price",price);
             .addOrder( Order.asc("date") )
             .setFirstResult(0)
             .setMaxResults(10);
c.list();

どのように私は、同じ基準のインスタンスを使用しますが、(例えば)第二の基準を削除することができますか? 私は、ユーザーがバックエンドが最初から基準を再構築することなく、フィルタを削除させたいのですがした動的問合せを構築しようとしている。

ありがとうございます。

役に立ちましたか?

解決

私の知る限りでは、あなたがそれを作成した後、基準クエリから物事(制限事項、発注など)を削除する方法はありません。私は、クライテリアAPIの内部に関する十分な知識が豊富ではないんだけど、私は、公開されたインターフェースでは何もありません知っています。クリーナーの選択肢がある場合は特に、あなたがaddまたはaddOrderすることで渡しているオブジェクトを操作しようとすることができ、それは価値があるよりも、それは多くの作業のように聞こえるます。

基準クエリは確かにワンショットは、私が見てきたすべてのアプリケーションで使用されています。

さて、何を行うことができますすること(例えば、Collection)カスタム形式での制限、順序と制限を保存し、その保存された形式から非常に簡単にクエリを構築しています。あなたは確かにそこからのきめ細かな制御を必要とするので、これはおそらくあなたのユーザインタフェースに、より理にかなってます。

は、あなたが答え探しているわけではありません、私は確信しているが、それは私が過去に行ってきた、まさにです。

HTH

他のヒント

  

どのように私は、同じ基準のインスタンスを使用しますが、(例えば)第二の基準を削除することができますか?私は、ユーザーがバックエンドが最初から基準を再構築することなく、フィルタを削除させたいのですがした動的問合せを構築しようとしている。

あなたは、あなたが動的なクエリを構築するために使用されるパラメータの全体(更新)セットを再送信する必要がありますすることはできません。

あなたはこの方法での規準を削除することができます:

public static void List<CriterionType> removeCriterions(Criteria criteria, Class<? extends Criterion> type) {
    Iterator<CriterionEntry> criterionIterator = ((CriteriaImpl) criteria).iterateExpressionEntries();
    while (criterionIterator.hasNext()) {
        CriterionEntry criterionEntry = criterionIterator.next();
        if (criterionEntry.getCriteria() == criteria) {
            Criterion criterion = criterionEntry.getCriterion();
            if (null == type || criterion.getClass() == type) {
                criterionIterator.remove();
            }
        }
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top