2013-03-28 18 views
5

Ho avuto due entità Hibernate qui con annotazione:Come rendere questa selezione * da due query di tabelle unite in forma HQL?

@Entity 
@Table(name = "CLIENT") 
public class Client { 

    private Long pkClient; 
    private String name; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="PK_CLIENT") 
    public Long getPkClient() { 
     return pkClient; 
    } 
    public void setPkClient(Long pkClient) { 
     this.pkClient = pkClient; 
    } 

    @Column(name="NAME") 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 

    ... 
} 

@Entity 
@Table(name="ACCOUNT") 
public class Account { 

    private Long pkClientAccount; 
    private Long fkClient; 
    private String accountNo; 

    @Id 
    @Column(name="PK_CLIENT_ACCOUNT") 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    public Long getPkClientAccount() { 
     return pkClientAccount; 
    } 
    public void setPkClientAccount(Long pkClientAccount) { 
     this.pkClientAccount = pkClientAccount; 
    } 

    @Column(name="FK_CLIENT") 
    public Long getFkClient() { 
     return fkClient; 
    } 
    public void setFkClient(Long fkClient) { 
     this.fkClient = fkClient; 
    } 

    @Column(name="ACCOUNT_NO") 
    public String getAccountNo() { 
     return accountNo; 
    } 
    public void setAccountNo(String accountNo) { 
     this.accountNo = accountNo; 
    } 

    ... 
} 

La relazione è uno-a-molti, che un cliente ha molti account. La tabella ACCOUNT ha una chiave esterna (FK_CLIENT) per la tabella della chiave primaria del CLIENT (PK_CLIENT).

voglio eseguire questa interrogazione in forma HQL:

select * from ACCOUNT a inner join CLIENT b on a.FK_CLIENT = b.PK_CLIENT 

Questo significa, verranno selezionati tutti oggetti di account e l'entità del client.

Qualcuno sa come fare quella query in forma HQL?

AFAIK, in HQL possiamo selezionare solo un'entità.

Nota:
non posso utilizzare la mappatura @ManyToOne in entità account perché non v'è già di proprietà fkClient e non posso cambiare questo perché il get/setFkClient è già stato utilizzato in altri luoghi.

Il codice sopra è stato semplificato rimuovendo parti non correlate per facilitare la lettura. Se trovi un refuso, fammelo sapere nella sezione commenti poiché ho digitato il codice manualmente.

+2

Se non è possibile fare una mappatura per dire ibernazione che quei due sono legati quindi di ibernazione non può aiutare. Dovresti prima selezionare i tuoi oggetti Account', quindi creare un 'Collection' di' Client' id da loro e fare un'altra selezione. In ogni caso, non è così che funziona l'ibernazione, si legge su [semplici relazioni] (http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html). Il tuo "Account" deve avere un riferimento a una chiave esterna "Client' _object_, ** not **. È quindi il lavoro di ibernazione per popolare tale riferimento oggetto dal database. –

+0

duh, quindi nessuna soluzione con ibernazione? Non riesco ad aggiungere mappature senza rompere altri codici. – null

risposta

14

Sì, è possibile selezionare diverse entità con HQL. Hibernate restituisce un array di tipo Object[].

select 
    account, 
    client 
from Account account, Client client 
where account.fkClient = client.pkClient 
+0

grazie, funziona. Ho creato il codice che chiama il nomeQuery, ma non so dove mettere il codice? Ho un account AccountDao e un bean ClientDao (l'applicazione è realizzata con spring + hibernate). Dove pensi che dovrei inserire il codice? AccountDao o ClientDao o creare un altro bean? – null

+1

Non penso che dovresti creare un altro bean. IMHO, non importa se lo metti in AccountDoa o in ClientDao. –

0

È possibile utilizzare:

select * from TB_1 as a 
left join TB_2 as b 
on a.ID_TB_1 = b.ID_TB_2 and b.ID_TB_2 is null 
+0

Si prega di aggiungere alcuni dettagli. Con ciò un visitatore troverà la tua risposta più utile. – Jayan

2

Con Hibernate 5.1, è ora possibile unire le entità anche se la mappatura non rispecchia il rapporto tabella del database.

Quindi, questa query HQL è valido dal Hibernate 5.1:

select 
    account, 
    client 
from Account account 
join Client client on account.fkClient = client.pkClient