2010-03-12 9 views
5

Na przykład jeśli mam zrobić coś jak:Jak usunąć kryterium z kryteriów?

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

Jak mogę korzystać z tej samej instancji kryteriów, ale usunąć (na przykład), drugie kryterium? Próbuję utworzyć kwerendę dynamiczną, w której chciałbym umożliwić użytkownikowi usunięcie filtru, bez konieczności zrekonstruowania kryteriów od podstaw.

Dziękuję

Odpowiedz

6

O ile mi wiadomo, nie ma sposobu, aby usunąć rzeczy (ograniczenia, nakazując, etc) z kwerendy kryteria, po jej utworzeniu. Nie mam wystarczającej wiedzy na temat wewnętrznych cech API Criteria, ale wiem, że nie ma nic w wyeksponowanym interfejsie. Możesz spróbować manipulować obiektami, które przechodzisz, do add lub addOrder, ale to brzmi jak więcej pracy, niż jest warta, szczególnie, gdy istnieją czystsze alternatywy.

Zapytania o kryteria są z pewnością jednorazowymi zastosowaniami w każdej aplikacji, którą widziałem.

Teraz można przechowywać ograniczenia, zamówienia i ograniczenia w niestandardowym formacie (np. Collection), a następnie łatwo zbudować zapytanie z tego zapisanego formatu. Prawdopodobnie miałoby to większy sens dla interfejsu użytkownika, ponieważ na pewno potrzebujesz precyzyjnej kontroli.

Nie jestem odpowiedzią, której szukam, jestem pewien, ale to jest dokładnie to, co zrobiłem w przeszłości.

HTH

1

Jak mogę korzystać z tej samej instancji kryteriów, ale usunąć (na przykład), drugie kryterium? Próbuję utworzyć kwerendę dynamiczną, w której chciałbym zezwolić użytkownikowi na usunięcie filtru, bez konieczności zrekonstruowania kryteriów od podstaw.

Nie możesz, będziesz musiał ponownie wysłać cały (zaktualizowany) zestaw parametrów użytych do zbudowania zapytania dynamicznego.

0

kryteriów można usunąć w następujący sposób:

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(); 
      } 
     } 
    } 
} 
Powiązane problemy