2011-06-29 19 views
7

Tengo una dirección con nombre de Entidad. La dirección Entity tiene varios campos, uno de los cuales es CITY. Creé una consulta llamando a entityManager.createQuery pero mi consulta solo incluye el campo CITY en la cláusula select (porque solo quiero cargar ese campo). El campo CITY es de tipo String. Cuando obtengo mi lista de resultados, no obtengo una lista de objetos de Dirección, sino una lista de Objeto [].JPA 2.0: Cargar un subconjunto de campos para una entidad

¿Hay alguna forma de tener una lista de Dirección creada en lugar de una lista de Objeto []? Mi proveedor de JPA está hibernado, la última versión. Quiero una solución que no requiera el uso de nada específico de Hibernate.

+0

JPA no tiene "fetch-groups", así que no puede hacer eso ... aparte de definir todos los campos aparte de "city" como cargar LAZY. Obviamente, con JDO puedes hacerlo – DataNucleus

Respuesta

2

¿Cómo cargaría Hibernate las instancias de dirección si solicita las ciudades? Las entidades JPA son objetos y se supone que los objetos respetan invariantes. Por ejemplo, una de esas invariantes podría ser que una dirección siempre tiene una ID, una calle, etc. Si Hibernate carga objetos parciales (con solo el atributo de ciudad lleno), esas invariantes se romperían y ya no podría confiar en su propio código . También podría tener todo tipo de problemas si intentara adjuntar dicha Dirección a otro objeto, o si simplemente trató de eliminarlo, porque ya ni siquiera tendría una ID.

Así que la respuesta corta es no: no es posible.

La respuesta larga es que dado que la dirección es un POJO, solo tiene que crear direcciones de las ciudades cargadas por usted mismo, o mediante el uso de un ResultTransformer. Pero obtendrías instancias de direcciones transitorias en lugar de entidades de direcciones adjuntas. Esta es una receta para innumerables errores y confusión, en mi humilde opinión.

+2

"... Esta es una receta para innumerables errores y confusión, en mi humilde opinión ..." ¿Cómo se puede decir que sin saber el caso de uso ??? –

+1

Porque mi experiencia en el desarrollo de aplicaciones Hibernate me enseñó que Hibernate no es una herramienta fácil de usar, y que tener Address utilizado como una entidad persistente a veces y como un objeto de datos en otras ocasiones será confuso cuando usted o algún desarrollador junior tendrá que mantener el código en dos años. Pero tú eres el que decide. Solo estoy aquí para ayudar. –

+0

Además, no nos ha dicho por qué sería una buena idea tener direcciones que contengan solo el atributo de la ciudad, en lugar de simplemente usar la ciudad como una Cadena. –

14

Esto es posible con expresiones de constructor en su consulta. Normalmente, usaría esto con un DTO personalizado, pero también debería funcionar con la entidad. En primer lugar crear una constructora adicional en su entidad, que sólo los campos necesarios:

public Address() { 
    //default constructor 
} 

public Address(String city) { 
    this.city = city; 
} 

su consulta a continuación, podría tener este aspecto:

select new your.package.Address(a.city) from Address a where ... 

Tenga en cuenta que el objeto resultante no se une a la EntityManager, así que los cambios a ella no se mantendrá automáticamente.

+0

Tu deberías aceptar esta respuesta si es lo que querías. De lo contrario, comparta su solución para ayudar a otros. –

Cuestiones relacionadas