2012-04-25 12 views
11

Me pregunto si es posible inicializar un atributo transitorio de una entidad durante una consulta de criterios.Inicializando un atributo transitorio de una entidad JPA durante el CriteriaQuery

Ejemplo

@Entity 
public SampleEntity{ 

    @Id 
    private long id; 

    [more attributes] 

    @Transient 
    private String someTransientString; 

    [getters and setters] 
} 

Ahora quiero componer una CriteriaQuery que carga todos los SampleEntity s y ajusta automáticamente a someTransientStringimamightlyfinestring. Tengo algo así como el SQL siguiente en mente:

SELECT ID AS ID, [..], 'imamightilyfinestring' AS SOME_TRANSIENT_STRING FROM SAMPLE_ENTITY 

que, por supuesto, sé que puedo simplemente iterar la colección resultante y establecer manualmente el atributo, pero me pregunto si hay una manera de hacerlo dentro de JPA2 .

Gracias :)

Respuesta

11

No, no puede hacerlo en la consulta.

Si puede averiguar valor para someTransientString fuera de consulta, puede utilizar PostLoad de devolución de llamada (extracto de JPA 2.0 especificación):

El método PostLoad para una entidad se invoca después de la entidad ha sido loaded en el contexto de persistencia actual de la base de datos o después de se le ha aplicado la operación de actualización. El método PostLoad es invocado antes de que se devuelva o acceda el resultado de una consulta o antes de que se cruce una asociación .

apenas añade la siguiente a su entidad:

@PostLoad 
protected void initSomeTransientString() { 
    //Likely some more complex logic to figure out value, 
    //if it is this simple, just set it directly in field declaration. 
    someTransientString = "imamightilyfinestring"; 
} 
+0

Gracias, pensé lo mismo. – ftr

0

También puede inicializar las corrientes transitorias en el valor por defecto (es decir, ningún argumento) constructor.

Se puede ver que esta es la estrategia utilizada, por ejemplo, en EclipseLink (leer el último comentario en el siguiente enlace):

https://bugs.eclipse.org/bugs/show_bug.cgi?id=292385

Cuestiones relacionadas