2010-03-04 10 views
8

Estoy cerrando de How to join tables in unidirectional many-to-one condition?.¿Cómo dejo las tablas de unión en unidireccionales de muchos a uno en Hibernate?

Si tiene dos clases:

class A { 
    @Id 
    public Long id; 
} 

class B { 
    @Id 
    public Long id; 
    @ManyToOne 
    @JoinColumn(name = "parent_id", referencedColumnName = "id") 
    public A parent; 
} 

B -> A es una relación de muchos a uno. Entiendo que podría agregar una colección de Bs a A sin embargo, no quiero esa asociación.

Así que mi pregunta real es, ¿Hay una manera de HQL o criterios de creación de la consulta SQL:

select * from A left join B on (b.parent_id = a.id) 

Esto recuperará todos los registros A con un producto cartesiano de cada registro B que hace referencia A y incluirá registros A que no tienen B haciendo referencia a ellos.

Si utiliza:

from A a, B b where b.a = a 

entonces es una combinación interna y no recibe los registros A que no tienen un B referencia a ellos.

No he encontrado una buena manera de hacer esto sin dos consultas, por lo que cualquier cosa menos que eso sería genial.

Gracias.

+0

@Joe B Y lo que quieres es ... ??? –

+0

@Arthur Ronald F D Garcia: Necesito una forma de Criteria o HQL de hacer la consulta SQL sin procesar que escribí arriba. He editado la publicación para poner la pregunta en negrita. – jbarz

Respuesta

2

que he hecho un ejemplo de lo que usted envió y creo que esto puede funcionar:

select a,b from B as b left outer join b.parent as a en HQL.

Tengo que encontrar una manera de "criterios" para hacerlo.

+0

Lo siento, leí mal, esto no es lo que necesita – Luciano

+1

Quizás ESTO haría el truco: seleccione a, b de B como b, haga clic derecho en b.parent como – Luciano

+0

No pensé en una unión correcta. Siempre que HQL admita combinaciones correctas y solo estoy usando algunas tablas que podrían funcionar. Lo probaré. – jbarz

1

Puede hacerlo especificando el atributo fetch.

(10) fetch (opcional) Elija entre la obtención y recuperación de unión externa mediante selección secuencial.

Lo encuentras en: Chapter 6. Collection Mapping, desplácese hacia abajo para: 6.2. Asignación de una colección

EDITAR

leí en el comentario de su pregunta que quería una manera de realizar una consulta SQL en bruto? Aquí una referencia que posiblemente podría ser de interés:

Chapter 13 - Native SQL Queries

y si quieres una manera de hacer que sea posible a través de HQL:

Chapter 11. HQL: The Hibernate Query Language

En el capítulo 11, que desea desplazarse hacia abajo a 11.3. Asociaciones y se une al.

IQuery q = session.CreateQuery(@"from A as ClassA left join B as ClassB"); 

Supongo que ClassB necesita ser miembro de ClassA. Más cambios ayudarán.

Otra cosa que podría proove a ser útil para usted es named queries:

<query name="PeopleByName"> 
from Person p 
where p.Name like :name 
</query> 

Y llamando a esta consulta desde el código de este modo:

using (var session = sessionFactory.OpenSession()) 
    using (var tx = session.BeginTransaction()) { 
     session.GetNamedQuery("PeopleByName") 
      .SetParameter("name", "ayende") 
      .List(); 
     tx.Commit(); 
    } 

favor, eche un vistazo al enlace al que hace referencia Ayende quien lo explica más en profundidad.

+0

No quiero asignar la colección de B en A. Necesito una consulta sin la colección asignada. – jbarz

Cuestiones relacionadas