2

Conjunctionsとsの使用に問題がありDisjunctionます。私のプログラムは、UIから任意の数のフィルター要素(それぞれがを表すCriterion)を受け取り、それらをまたはとしてチェーンすることを目的としていANDますOR

したがって、たとえば、次のような3つの要素を持つことができます(私はaCriterionを文字で表します)。

a OR b AND c

私のコードは次のようになります:

    // ...
    Criteria rootCriteria = createCriteria(entityClass);
    Conjunction conjunction = Restrictions.conjunction();
    Disjunction disjunction = Restrictions.disjunction();
    boolean isFirst = true;
    for (InternalFilterElement element : elements) {
        if (isFirst) {
            isFirst = false;
            rootCriteria.add(createCriterion(element.getFilterRelation(), element.getValue()));
        } else if (InternalFilterOperand.AND.equals(element.getInternalFilterOperand())) {
            addCriterionToJunction(conjunction, element);
        } else {
            addCriterionToJunction(disjunction, element);
        }
    }
    rootCriteria.add(disjunction);
    rootCriteria.add(conjunction);
    // ...

私の問題は、私が常にa AND b AND cいくつかの不要な括弧を取得することです。

私が本当に知りたいのは、このタスクに間違ったツールを使用しているかどうかです。どうすれば演​​算子ANDを組み合わせることができますか?OR

編集

InternalFilterOperand基本的にenum含むORAND

addCriterionToJunctionCriterion関係(<、>、...)と値にJunction基づいてにを追加するだけです。副作用はありません。

4

3 に答える 3

6

次のコードを使用して、HibernateでAND演算子とOR演算子を組み合わせます。

    Criteria rootCriteria = createCriteria(entityClass);
    rootCriteria.add(Restrictions.or(
            Restrictions.eq("a","a"),
            Restrictions.and(
                    Restrictions.eq("b","b"),
                    Restrictions.eq("c","c")
            )
    ));

この例では、次の出力が得られます。接続詞と論理和で得られる括弧なしのa = a OR b = b AND c=c。

于 2012-12-11T12:11:39.557 に答える
0

あなたはそれを必要以上に難しくしています。次のものだけを使用しないのはなぜですか。

Junction junction = 
    InternalFilterOperand.AND.equals(element.getInternalFilterOperand()) ? 
        Restrictions.conjunction() : 
        Restrictions.disjunction();
for (InternalFilterElement element : elements) {
    addCriterionToJunction(junction, element);
}
rootCriteria.add(junction);
于 2012-10-18T14:24:00.497 に答える
-1

他のすべてが正しく見えるので、それがInternalFilterOperandあなたに正しく設定されていないと私は信じています。elements

element.getInternalFilterOperand()検証および修正するための最初のステートメントとして、ループ内の値を出力/デバッグしてください。

編集:conjunction/disjunction直接追加してみてくださいrootCriteria

for (InternalFilterElement element : elements) {
  if (isFirst) {
      isFirst = false;
      rootCriteria.add(
                 createCriterion(element.getFilterRelation(), element.getValue()));
  }else if (InternalFilterOperand.AND.equals(element.getInternalFilterOperand())){
        //add debugg/sys out: adding conjunction
        System.out.println("adding conjunction");
        rootCriteria.add(Restrictions.conjunction().add(element));
  } else {
        //add debugg/sys out: adding disjunction
        System.out.println("adding disjunction");
        rootCriteria.add(Restrictions.disjunction().add(element));
  }
}
于 2012-10-18T14:47:01.650 に答える