2011-06-19 13 views
7

La situación es la siguiente:HQL: intento ilegal de recogida de eliminar la referencia

Tengo un libro entidad que tiene una relación de uno a muchos con el capítulo.

Ahora, si intento la consulta "from Book book inner join book.chapters chapter where chapter.title like '%hibernate%'", me da el resultado deseado.

Pero si intento, "from Book where book.chapters.title like '%hibernate%'", recibo el error intento ilegal de eliminar la colección.

Lo que pasa es que solo quiero la colección de objetos Book a cambio y no una colección de objetos Book and Chapter a cambio que obtengo con la consulta anterior.

¿Alguien podría ayudarme a entender?

Respuesta

12

chapters es una colección en libros y por lo tanto no tendrá el título de propiedad (Collection.title). Necesita unir los capítulos para incluirlos en su consulta como su primer ejemplo. Si sus capítulos se mapean perezosamente, solo obtendrá una colección de libros sin los capítulos cargados en ellos. Entonces yo diría que usa tu primera consulta.

Para obtener más información, eche un vistazo a las páginas query HQL joins y performance fetching.

+1

Aunque entidad capítulo fue mapeado con pereza, ¿por qué habría que obtener sólo la colección de libros con mi anterior consulta? Creo que 'seleccionar el libro de libro interno unirse libro.capítulo capítulo donde capítulo.título como '% hibernate%' 'era lo que debería probar en su lugar, en primer lugar. Muchas gracias por su respuesta :) – skip

+0

Agregué dos enlaces a mi respuesta que esbozan las estrategias de búsqueda. – joostschouten

+0

Gracias por los enlaces, pero obtuve pares de libro y capítulo en el resultado, incluso cuando estaba usando LAZY para la estrategia de búsqueda. Aunque obtuve objetos duplicados para libros. Gracias por los enlaces :) :) – skip

2

Puede hacer esto con una subconsulta.

Algo así como

from Book book where not exists (from chapter where 
        chapter.title like '%hibernate%' and chapter.book = book) 

(No se ha probado ...)

+1

Sí, eso está bien. Por alguna razón, pensé que tenías algo que te daba más información de la que querías. –

+1

'seleccionar el libro de la libreta de libros libro de capítulos internos capítulo.capítulos donde chapter.title como '% hibernate%'' está funcionando bien para mí. Muchas gracias por su respuesta :) – skip

+0

Perdón por el error tipográfico en mi último comentario, se suponía que era título e hibernación. Sí, solo necesitaba eliminar los objetos duplicados y quería usar algo como LinkedHashSet en la colección de libros recuperados de la consulta. Gracias :) – skip

Cuestiones relacionadas