2013-03-28 93 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