2013-03-28 96 views
5

我這裏有兩個休眠實體註釋:如何使這個select *從兩個連接表中查詢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; 
    } 

    ... 
} 

的關係是一對其中許多客戶端有很多賬戶。表ACCOUNT具有到客戶端主鍵(PK_CLIENT)的外鍵(FK_CLIENT)。

我想在HQL的形式執行此查詢:

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

這意味着,從客戶和用戶實體的所有屬性將被選中。

任何人都知道如何使用HQL形式進行查詢?

AFAIK,在HQL中我們只能選擇一個實體。

注:
我不能使用@ManyToOne映射帳戶實體,因爲已經有fkClient財產,這是因爲GET/setFkClient已經用在別的地方我不能改變。

上述代碼已通過刪除無關部分以簡化閱讀而得到簡化。如果您發現錯字,請在評論部分讓我知道,因爲我手動鍵入了代碼。

+2

如果你不能做一個映射告訴Hibernate,這兩個是相關的,則Hibernate也幫不了你。您必須首先選擇您的「Account」對象,然後從它們中創建一個'Client' ID,並進行另一次選擇。無論如何,這不是hibernate的工作原理,請閱讀[簡單關係](http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html)。你的'Account'需要引用一個'Client' _object_,**而不是**外鍵。然後從數據庫填充該對象引用是hibernate的工作。 – 2013-03-28 08:32:47

+0

呵呵,所以用hibernate完全沒有解決方案?我不能添加映射而不破壞其他代碼。 – null 2013-03-28 08:43:06

回答

14

是的,你可以選擇與HQL幾個實體。 Hibernate會返回一個類型Object[].

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

謝謝,它的工作原理。我創建了調用namedQuery的代碼,但我不知道該把代碼放在哪裏?我有AccountDao和ClientDao bean(應用程序是用spring + hibernate構建的)。你認爲我應該把代碼放在哪裏? AccountDao或ClientDao或創建另一個bean? – null 2013-03-28 09:31:53

+1

我不認爲你應該創建另一個bean。恕我直言,你把它放在AccountDoa或ClientDao中並不重要。 – 2013-03-28 10:10:53

0

的陣列可以使用:

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

請添加一些細節。有了這個訪問者會發現你的答案更有幫助。 – Jayan 2016-02-11 16:33:34

2

隨着Hibernate 5.1,它現在可能加盟實體即使映射不鏡像數據庫表的關係。

所以,這HQL查詢是由Hibernate 5.1有效:

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