2010-03-12 8 views
5

Por ejemplo, si hago algo como:¿Cómo se puede eliminar un criterio de los criterios?

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

¿Cómo puedo usar la misma instancia de criterios, pero quito (por ejemplo) el segundo criterio? Estoy tratando de crear una consulta dinámica en la que me gustaría dejar que el usuario elimine un filtro, sin que el motor tenga que reconstruir los criterios desde cero.

Gracias

Respuesta

6

Por lo que yo sé, no hay manera de quitar cosas (restricciones, pedidos, etc.) a partir de la consulta criterios, una vez que se crea. No estoy lo suficientemente informado sobre los aspectos internos de la API de Criteria, pero sé que no hay nada en la interfaz expuesta. Puede tratar de manipular los objetos que está pasando en add o addOrder, pero eso suena como más trabajo de lo que vale, especialmente cuando hay alternativas más limpias.

Las consultas de criterios ciertamente han sido usos únicos en cada aplicación que he visto.

Ahora, lo que puede hacer es almacenar sus restricciones, pedidos y límites en un formato personalizado (por ejemplo, Collection) y luego generar su consulta fácilmente desde ese formato almacenado. Esto probablemente tenga más sentido para su interfaz de usuario ya que ciertamente necesita un control detallado desde allí.

No es la respuesta que está buscando, estoy seguro, pero es exactamente lo que hice en el pasado.

HTH

1

¿Cómo puedo usar la misma instancia de criterios, pero eliminar (por ejemplo) el segundo criterio? Intento crear una consulta dinámica en la que me gustaría dejar que el usuario elimine un filtro, sin que el backend tenga que reconstruir los criterios desde cero.

No puede, tendrá que volver a enviar todo el conjunto de parámetros (actualizado) utilizado para generar la consulta dinámica.

0

Puede quitar criterios de esta manera:

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(); 
      } 
     } 
    } 
} 
Cuestiones relacionadas