2012-07-12 14 views
5

Ho tre entità come segue:Come ottimizzare un JPA Query

public class EntityA 
{ 
    private Long id; 
    //Getters and setters 
} 

public class EntityB 
{ 
    private Long id; 
    private EntityA entitya; 
    //Getters and setters 
} 

public class EntityC 
{ 
    private Long id; 
    private BigDecimal amount; 
    private EntityB entityb; 
    //Getters and setters 
} 

Ora, data di un'istanza di EntityA, voglio ottenere un elenco di EntityC. Al momento ho due opzioni a mia disposizione. Non so quale sia più ottimizzato. Le opzioni sono:

1. 
select c from EntityC c where c.entityb in (select b from EntityB b where b.entitya = :entitya) 

2. aggiungere una nuova proprietà per EntityB

private Set<EntityC> entityCCol; 

@OneToMany(mappedBy="entityb") 
public Set<EntityC> getEntityCCol() 
{ 
    return entityCCol; 
} 

select b from EntityB a join fetch a.entityCCol b 

Quale di queste due domande è più facile e ottimizzato?

+1

Cosa riguardo 'selezionare c da EntityC c dove c.entityB.entityA =: a'? se crei questa query, e 'crei l'indice IX_B_A sull'entitàB (entityA, id)' la query risultante sarà abbastanza veloce. –

risposta

3

Dipende dalle dimensioni della raccolta. Per le piccole collezioni, utilizzerei le relazioni nel modello a oggetti. Più da un punto di vista progettuale/usabilità rispetto alle prestazioni, è più orientato agli oggetti. Non mi unirei a prenderlo però, basta accedere normalmente al modello. Probabilmente dovresti anche avere una relazione da A a B per rendere il tuo modello più utile.

per la query a # 1, la query non è molto efficiente utilizzando le sub-select, basta usare un join,

selezionare c da EntityC c dove c.entityb.entitya =: entitya

2

Penso che tutte le query con interpretazioni in query SQL, questi sono solo stili diversi, non devi pensarci. tutte le domande saranno interpretate in stile theta. Non penso, c'è una differenza di prestazioni, è solo una scelta personale. ecco un articolo molto recente sullo stile di query SQL MySQL joins: ON vs. USING vs. Theta-style, spero che questo link ti aiuti in qualche modo.

+0

La mia preoccupazione per le due query precedenti e qualsiasi altra query suggerita è la prestazione. Indovina cosa, nel database EntityB hanno circa 20.000 record e ognuno dei 20.000 record ha almeno 200 record, ad esempio EntityC. –

Problemi correlati