【发布时间】: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对象,然后从它们创建Collection的Clientid 并进行另一次选择。无论如何,这不是休眠的工作方式,请阅读simple relationships。您的Account需要引用Clientobject, not 外键。然后,休眠的工作就是从数据库中填充该对象引用。 -
duh,所以休眠完全没有解决方案?我无法在不破坏其他代码的情况下添加映射。
标签: java hibernate hql hibernate-annotations named-query