2010-03-04 7 views
8

Sono piggy-off di How to join tables in unidirectional many-to-one condition?.Come ho lasciato le tabelle di join in unidirezionale many-to-one in Hibernate?

Se si dispone di due classi:

class A { 
    @Id 
    public Long id; 
} 

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

B -> A è una relazione molti a uno. Capisco che potrei aggiungere una raccolta di Bs ad A, ma non voglio quell'associazione.

Quindi la mia domanda reale è, C'è un modo HQL o criteri di creare query SQL:

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

Questo recupererà tutti i record con un prodotto cartesiano di ogni record B che fa riferimento A e includerà un record che non ha B che fa riferimento a loro.

se si utilizza:

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

, allora è una join interno e non si ricevono i record A che non hanno un B loro riferimento.

Non ho trovato un buon modo per farlo senza due query, quindi niente di meno sarebbe bello.

Grazie.

+0

@Joe B E quello che vuoi è ... ??? –

+0

@Arthur Ronald F D Garcia: Ho bisogno di un metodo Criteria o HQL per creare la query SQL raw che ho scritto sopra. Ho modificato il post in grassetto la domanda vera e propria. – jbarz

risposta

2

Ho fatto un esempio con quello che hai postato e penso che questo può funzionare:

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

Devo trovare un "criterio" per farlo.

+0

Scusate, ho letto male, questo non è quello che vi serve – Luciano

+1

Forse QUESTO sarebbe il trucco: selezionare a, b da B come b right b.parent come – Luciano

+0

Non pensavo a un join giusto. Finché HQL supporta i giusti join e sto usando solo poche tabelle che potrebbero funzionare. Lo proverò. – jbarz

1

È possibile farlo specificando l'attributo di recupero.

(10) recupero (facoltativo) Scegliere tra il recupero e il recupero dall'unione esterna mediante selezione sequenziale.

Lo trovi all'indirizzo: Chapter 6. Collection Mapping, scorrere fino a: 6.2. Mappare una collezione

EDIT

ho letto il commento di tua domanda che si voleva un modo per eseguire una query SQL crudo? Ecco un riferimento che potrebbe eventualmente essere di interesse:

Chapter 13 - Native SQL Queries

e se si vuole un modo per rendere possibile attraverso HQL:

Chapter 11. HQL: The Hibernate Query Language

Nel capitolo 11, si vuole scorrere verso il basso a 11.3. Associazioni e join.

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

Immagino tuttavia che ClassB debba essere un membro di ClassA. Altre rassicurazioni aiuteranno.

Un'altra cosa che potrebbe proove per essere utile a voi sono named queries:

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

e chiamando questa query da codice in questo modo:

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

prega di dare un'occhiata al link a cui fa riferimento Ayende che lo spiega più in profondità.

+0

Non voglio mappare la collezione di B in A. Ho bisogno di una query senza la collezione mappata. – jbarz

Problemi correlati