2012-04-25 14 views
11

Mi chiedo se sia possibile inizializzare un attributo transitorio di un'entità durante una query di criteri.Inizializzazione di un attributo transitorio di un'entità JPA durante CriteriaQuery

Esempio

@Entity 
public SampleEntity{ 

    @Id 
    private long id; 

    [more attributes] 

    @Transient 
    private String someTransientString; 

    [getters and setters] 
} 

Ora voglio comporre un CriteriaQuery che carica tutti SampleEntity s e imposta automaticamente someTransientString-imamightlyfinestring. Ho qualcosa come il seguente SQL in mente:

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

Io naturalmente so che posso semplicemente scorrere la collezione risultante e impostare manualmente l'attributo, ma mi chiedo se c'è un modo per farlo entro JPA2 .

Grazie :)

risposta

11

No, non è possibile farlo in query.

Se si riesce a capire il valore per someTransientString al di fuori di query, è possibile utilizzare PostLoad richiamata (estratto da JPA 2.0 specifica):

Il metodo post-carico per un'entità viene richiamato dopo che l'entità è stata caricata nel contesto di persistenza corrente dal database o dopo è stata applicata l'operazione di aggiornamento. Il metodo PostLoad è richiamato prima che un risultato della query venga restituito o consultato o prima che venga attraversata un'associazione .

basta aggiungere in seguito alla vostra entità:

@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

Grazie, ho pensato tanto. – ftr

0

È anche possibile inizializzare le transienti in default (vale a dire, nessun argomento) del costruttore.

Si può vedere che questa è la strategia utilizzata, per esempio, in EclipseLink (leggi l'ultimo commento al seguente link):

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

Problemi correlati