5

我在这里有两个带有注释的休眠实体:

@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 具有表 CLIENT 的主键 (PK_CLIENT) 的外键 (FK_CLIENT)。

我想以 HQL 形式执行此查询:

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

这意味着,将选择来自 Account 和 Client 实体的所有属性。

有人知道如何以 HQL 形式进行查询吗?

AFAIK,在 HQL 中我们只能选择一个实体。

注意:
我不能在 Account 实体中使用 @ManyToOne 映射,因为已经有 fkClient 属性并且我无法更改它,因为 get/setFkClient 已经在其他地方使用过。

上面的代码已经通过删除不相关的部分进行了简化,以便于阅读。如果您发现错字,请在评论部分告诉我,因为我手动输入了代码。

4

4 回答 4

17

是的,您可以使用 HQL 选择多个实体。Hibernate 将返回一个类型的数组Object[].

select 
    account, 
    client 
from Account account, Client client 
where account.fkClient = client.pkClient
于 2013-03-28T08:47:39.603 回答
3

使用Hibernate 5.1,即使映射不反映数据库表关系,现在也可以连接实体。

因此,此 HQL 查询从 Hibernate 5.1 开始有效:

select 
    account, 
    client 
from Account account 
join Client client on account.fkClient = client.pkClient
于 2016-02-12T16:31:32.593 回答
0

尝试关注 HQL

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

有关更多详细信息,请参阅 Hibernate 参考文档 http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/queryhql.html#queryhql-where

于 2013-03-28T08:45:35.930 回答
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 
于 2016-02-11T13:33:57.257 回答