2012-03-28 58 views
14

Necesito unir dos entidades JPA en una propiedad cuando no hay una relación FK/PK entre las dos. estoy usando Hibernate y puedo usar HQL consulta como estaUnir dos tablas no relacionadas usando JPA EntityManager

select foo, bar from FooEntity as foo, BarEntity as bar 
where foo.someothercol = 'foo' and foo.somecol = bar.somecol 

Sin embargo, quiero evitar la dependencia de Hibernate y utilizar en su lugar EntityManager. Por favor ayuda.

Respuesta

19

Su consulta es válida para JPQL y no utiliza la funcionalidad específica de Hibernate (solo falta el espacio entre la barra y desde). En JPA 2.0 especificación (4.4.5 uniones) esto se explica con palabras siguientes:

Una combinación interna puede ser especificado implícitamente por el uso de un producto cartesiano en la cláusula FROM y una condición de unión en la cláusula WHERE . En ausencia de una condición de unión, esto se reduce al producto cartesiano .

El caso de uso principal para este estilo de unión generalizado es cuando una condición de unión no implica una relación de clave externa que es asignada a una relación de entidad. Ejemplo: c SELECT FROM cliente C,

Empleado E donde c.hatsize = e.shoesize

diferencia principal a la consulta es que su seleccione contiene dos tipos de entidades. El resultado de la consulta es Lista de objetos []. El orden de los elementos en el conjunto es el mismo que en la instrucción select . Los siguientes trabajos en su caso:

String query = 
    "select foo, bar from FooEntity as foo, BarEntity as bar "+ 
    "where foo.someothercol = 'foo' and foo.somecol = bar.somecol"; 
List<Object[]> results = em.createQuery(query).getResultList(); 

for (Object[] fooAndBar: results) { 
    FooEntity foo = (FooEntity) fooAndBar[0]; 
    BarEntity bar = (BarEntity) fooAndBar[1]; 
    //do something with foo and bar 
} 
+0

falta el espacio entre la barra y el finalizado! –

Cuestiones relacionadas