我在这里有两个带有注释的hibernate实体:
@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
这意味着,将选择帐户和客户实体的所有属性。
任何人都知道如何以HQL形式进行查询?
AFAIK,在HQL中我们只能选择一个实体。
注意:
我不能在Account实体中使用@ManyToOne映射,因为已经有fkClient属性,我无法更改它,因为get / setFkClient已经在其他地方使用过。
通过删除不相关的部分以简化上述代码,使其更易于阅读。如果您发现拼写错误,请在评论部分告诉我,因为我手动输入了代码。
答案 0 :(得分:16)
是的,您可以使用HQL选择多个实体。
Hibernate将返回类型为Object[].
select
account,
client
from Account account, Client client
where account.fkClient = client.pkClient
答案 1 :(得分:2)
使用Hibernate 5.1,即使映射不镜像数据库表关系,现在也可以加入实体。
因此,这个HQL查询在Hibernate 5.1中有效:
select
account,
client
from Account account
join Client client on account.fkClient = client.pkClient
答案 2 :(得分: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
答案 3 :(得分: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