2010-03-12 6 views
5

Zum Beispiel, wenn ich so etwas wie:Wie können Sie ein Kriterium aus Kriterien entfernen?

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(); 

Wie kann ich die gleichen Kriterien Instanz verwenden, aber (zum Beispiel) das zweite Kriterium entfernen? Ich versuche, eine dynamische Abfrage zu erstellen, in der ich den Benutzer einen Filter entfernen lassen möchte, ohne dass das Backend die Kriterien von Grund auf neu erstellen muss.

Danke

Antwort

6

Soweit ich weiß, gibt es keine Möglichkeit, die Dinge (Einschränkungen, Bestellung, usw.) aus der Kriterien Abfrage zu entfernen, wenn Sie es schaffen. Ich bin nicht gut genug über die Interna der Criteria API informiert, aber ich weiß, dass es in der exponierten Schnittstelle nichts gibt. Sie könnten versuchen, die Objekte zu manipulieren, die Sie an add oder addOrder übergeben, aber das klingt nach mehr Arbeit als es wert ist, besonders wenn es sauberere Alternativen gibt.

Kriterien Abfragen wurden sicherlich One-Shot-Anwendungen in jeder Anwendung, die ich gesehen habe.

Jetzt können Sie Ihre Einschränkungen, Bestellungen und Limits in einem benutzerdefinierten Format speichern (z. B. Collection) und dann Ihre Abfrage ganz einfach aus diesem gespeicherten Format erstellen. Dies würde wahrscheinlich für Ihre Benutzerschnittstelle mehr Sinn machen, da Sie von dort aus sicherlich eine fein abgestimmte Steuerung benötigen.

Nicht die Antwort, die Sie suchen, bin ich sicher, aber es ist genau das, was ich in der Vergangenheit getan habe.

HTH

1

Wie kann ich die gleichen Kriterien Instanz, aber (zum Beispiel) das zweite Kriterium entfernen? Ich versuche, eine dynamische Abfrage zu erstellen, in der ich den Benutzer einen Filter entfernen lassen möchte, ohne dass das Backend die Kriterien von Grund auf neu erstellen muss.

Sie können nicht den gesamten (aktualisierten) Parametersatz erneut senden, der zum Erstellen der dynamischen Abfrage verwendet wurde.

0

Sie können Kriterien auf diese Weise entfernen:

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(); 
      } 
     } 
    } 
} 
Verwandte Themen