【问题标题】:How to make this select * from two joined tables query in HQL form?如何从 HQL 形式的两个连接表查询中选择 *?
【发布时间】:2013-03-18 14:49:03
【问题描述】:

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

@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 已经在其他地方使用过。

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

【问题讨论】:

  • 如果你不能做一个映射来告诉hibernate这两个是相关的,那么hibernate不能帮助你。您必须首先选择您的Account 对象,然后从它们创建CollectionClient id 并进行另一次选择。无论如何,这不是休眠的工作方式,请阅读simple relationships。您的 Account 需要引用 Client object, not 外键。然后,休眠的工作就是从数据库中填充该对象引用。
  • duh,所以休眠完全没有解决方案?我无法在不破坏其他代码的情况下添加映射。

标签: java hibernate hql hibernate-annotations named-query


【解决方案1】:

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

所以,这个 HQL 查询从 Hibernate 5.1 开始有效:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,它有效。我已经创建了调用namedQuery 的代码,但我不知道将代码放在哪里?我有 AccountDao 和 ClientDao bean(应用程序是用 spring+hibernate 构建的)。你认为我应该把代码放在哪里? AccountDao 或 ClientDao 还是创建另一个 bean?
    • 我认为您不应该创建另一个 bean。恕我直言,您将其放在 AccountDoa 还是 ClientDao 中并不重要。
    【解决方案3】:

    你可以使用:

    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 
    

    【讨论】:

    • 请补充一些细节。这样,访问者会发现您的回答更有帮助。
    【解决方案4】:

    尝试关注 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-16
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多