2012-06-09 26 views
6

¿Cómo implico la estrategia de carga diferida solo para una NamedQuery dada?JPA - Force Lazy loading solo para una consulta dada

por ej. Considere el pseudo código de abajo (sólo para explicar el caso) Tengo una entidad

@Entity 
class Xyz { 
int a; 
int b; 

@Fetch = EAGER 
Set<ABC> listOfItems; 
} 

En este caso, hemos declarado LISTOFITEMS ser recuperada tempranamente.

Ahora supongamos que tengo un NamedQuery (query="getXyz" , name="select x from Xyz x where a=?") Para esta consulta, solo necesito que el resultado sea flojo, es decir, no quiero que se recupere listOfItems.

¿Cuáles son las formas en que puedo lograrlos? ps: 1. No quiero cambiar las LISTOFITEMS ser perezoso en la clase de entidad 2. No quiero seleccionar campos específicos en la consulta como name="select a,b from Xyz z where a = ? "

Gracias de antemano por las sugerencias

+0

¿Qué vas a hacer con el resultado de NamedQuery? Puede haber alternativas a lo que estás tratando de lograr. – siebz0r

+0

@ siebz0r solo quiero los campos de primer nivel para mostrar. Mientras que hay otras pantallas donde hay que buscar el conjunto. En mi caso, quiero mejorar el rendimiento no buscándolas ansiosamente. Si tiene alguna sugerencia, por favor, comparta. Gracias ! –

+0

Sugeriría anotar el conjunto como flojo. ¿Por qué no es esto posible? – siebz0r

Respuesta

1

Si no desea buscar el Set ansiosamente tiene que definirlo como flojo. Sin embargo, tenga en cuenta que la implementación está permitida a buscar ansiosamente cuando especifica lazy.

Citando la especificación:

enumeración pública fetchType extiende java.lang.Enum

Define estrategias para ir a buscar los datos de la base de datos. La estrategia EAGER es un requisito en el tiempo de ejecución del proveedor de persistencia de que los datos deben obtenerse con entusiasmo. La estrategia LAZY es una pista para el tiempo de ejecución del proveedor de persistencia de que los datos se deben buscar de forma perezosa cuando se accede por primera vez. La implementación está permitida para recuperar datos para los cuales se ha especificado la sugerencia de estrategia LAZY.

Si sin embargo no se desea obtener como un Set que sería como una alternativa de crear una pequeña clase para adaptarse a sus necesidades:

@Entity 
@Table(name = "XYZ") 
public class XyzStub 
{ 
    int a; 
    int b; 
} 

Se pueden realizar consultas para esta usando un TypedQuery:

EntityManager em; 
//.... 
TypedQuery<XyzStub> q = em.createNamedQuery("select x from XyzStub x where x.a = :a", XyzStub.class) 
q.setParameter("a", a); 
Cuestiones relacionadas