2011-10-19 13 views
5

Tengo una clase de dominio llamada Order y esa clase tiene hasMany relación con la clase Item. Cuando consulto la lista de pedidos con ciertas restricciones, recibo tantas instancias de Order como items.Pregunta de criterios de Grails retruing instancias duplicadas

Así, por ejemplo Order instancia tiene decir referencias a 3 casos de Item continuación, criterios piden a Order está volviendo 3 instancias duplicadas de Order. No estoy seguro, pero si vale la pena mencionar que la clase de dominio Order tiene fetchMode establecido en "eager".

Estoy realmente desconcertado con lo que está pasando allí. Cualquier ayuda en este sentido será muy apreciada. Fragmento de código se adjunta:

def clazz = "cust.Order" 
def criteria = clazz.createCriteria() 
     println("clazz == "+Order.list())// returning correct data i.e unique instance of order 
     def filter = { 
        // trimmed down all filtering criteria for debugging 
      }//close filter 
     List results = criteria.list(max:params?.max,offset:params?.offset,filter) 
      results.each{Object data-> 
       println(data.getClass()) 
      } 
     println("results == "+results) 

Gracias de nuevo

Respuesta

2

API Criteria es sólo un envoltorio para la construcción de una consulta SQL. En su caso, la consulta en cuestión tiene UNIONES (debido a la búsqueda ansiosa) y devuelve un producto cartesiano de Pedidos y sus Artículos coincidentes. Cada fila devuelta se incluye en los resultados como una instancia de pedido separada.

La forma más fácil de eliminar duplicados es poner todos los resultados en un conjunto, como esto:

def resultSet = new HashSet() 
resultSet.addAll(results) 
println("results == " + resultSet) 
+0

Esto funcionó, pero ¿hay alguna forma mejor de solucionar esto? ¿Como cambiar el modo de búsqueda durante la consulta o algo así? – Amit

3

Si llama criteria.listDistinct en lugar de criteria.list duplicados serán eliminados

+0

Debe tenerse en cuenta que esto puede cambiar el tipo de resultados de un conjunto de resultados a una lista de objetos de dominio (paginación de rupturas en algunos casos). – bschipp

+1

No se pueden agregar parámetros como max o offset con listDistinct (El método listDistinct() no funciona bien con las opciones de paginación maxResult y firstResult. Si necesita resultados distintos con la paginación, actualmente recomendamos que use HQL), al menos en griales 2.xo inferior a – GSAN

0

También es posible usar dinámico buscadores, como en Order.findAllBy *. Dependiendo de qué tan complicado sea su filtro, esto podría ser fácil o difícil :)

+0

Mi filtro es bastante complicado y muy dinámico, no creo que FindBy funcione en este caso. El filtro también se aplica a los objetos anidados. Esa es una de las razones por las que decidí usar criterios sobre SQL nativo – Amit

3

Una solución es usar esto en su consulta:

resultTransformer org.hibernate.Criteria.DISTINCT_ROOT_ENTITY 
Cuestiones relacionadas