Domanda

Sto piggy-backing off di Come per unire le tabelle in unidirezionale molti-a-una condizione? .

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 è un rapporto molti a uno. Capisco che potrei aggiungere una raccolta di B ad A ma non voglio che questa 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 A con un prodotto cartesiano di ogni record B che i riferimenti A e includerà un record che non hanno B di loro riferimento.

Se si utilizza:

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

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

Non ho trovato un buon modo di fare questo senza due query in modo da niente di meno di quello sarebbe grande.

Grazie.

È stato utile?

Soluzione

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 modo "criteri" di fare questo però.

Altri suggerimenti

Si può farlo specificando l'attributo recupero.

  

(10) fetch (opzionale) Scegliere tra outer-join il recupero e il recupero da selezionare sequenziale.

Lo trovate in: Capitolo 6. Collection mappatura , scorrere fino a: 6.2. Mappare un Collection

Modifica

Ho letto nel commento del vostro domanda che si voleva un modo per eseguire una query SQL crudo? Ecco un riferimento che potrebbe eventualmente essere di interesse:

Capitolo 13 - Native SQL query

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

Capitolo 11. HQL: Il linguaggio Hibernate Query

Nel capitolo 11, si vuole scorrere fino a 11.3. Associazioni e unisce .

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

credo, tuttavia, che ClassB ha bisogno di essere un membro di ClassA. Ulteriori reasdings devono aiutare.

Un'altra cosa che potrebbe proove per essere utile a voi sono query denominate :

<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();
    }

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top