2012-07-12 113 views
5

tengo tres entidades de la siguiente manera:Cómo optimizar una consulta JPA

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 
} 

Ahora, dada una instancia de EntityA, quiero obtener una lista de EntityC. Tengo dos opciones disponibles para mí actualmente. No sé cuál está más optimizado. Las opciones son:

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

2. añadir una nueva propiedad a EntityB

private Set<EntityC> entityCCol; 

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

select b from EntityB a join fetch a.entityCCol b 

¿Cuál de estas dos consultas es más fácil y optimizado?

+1

Lo sobre 'select c from EntityC c donde c.entityB.entityA =: a'? si crea esta consulta y 'crea el índice IX_B_A en entityB (entityA, id)', la consulta resultante será lo suficientemente rápida. –

Respuesta

3

Depende del tamaño de la colección. Para colecciones pequeñas, usaría las relaciones en el modelo de objetos. Más desde una perspectiva de diseño/usabilidad que de rendimiento, está más orientada a objetos. Sin embargo, no me uniría a él, solo acceda al modelo normalmente. Probablemente también deberías tener una relación de A a B para que tu modelo sea más útil.

para la consulta en el # 1, su consulta no es muy eficiente el uso de los sub-selecciona, sólo tiene que utilizar una combinación,

seleccione c de c EntityC donde c.entityb.entitya =: entitya

2

creo que todas las consultas con las consultas SQL interpretadas, estos son solo diferentes estilos, no tiene que pensar en ello. todas las consultas serán interpretadas en estilo theta. No creo, hay una diferencia de rendimiento, es solo una elección personal. aquí hay un artículo muy reciente sobre el estilo de consulta SQL MySQL joins: ON vs. USING vs. Theta-style, espero que este enlace lo ayude de alguna manera.

+0

Mi preocupación en las dos consultas anteriores y cualquier otra consulta sugerida es el rendimiento. Adivina qué, en la base de datos EntityB tiene aproximadamente 20,000 registros y cada uno de los 20,000 registros tiene al menos 200 registros, es decir, EntityC. –

Cuestiones relacionadas