ここに注釈付きの2つの休止状態エンティティがありました:
@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;
}
...
}
関係は、クライアントが多くのアカウントを持っている1対多です。テーブル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では1つのエンティティしか選択できません。
注意:
すでにfkClientプロパティがあるため、Accountエンティティで@ManyToOneマッピングを使用できません。また、get/setFkClientが他の場所ですでに使用されているため、これを変更できません。
上記のコードは、関係のない部分を削除して読みやすくすることで簡略化されています。コードを手動で入力したので、タイプミスを見つけた場合は、コメントセクションでお知らせください。
はい、HQLで複数のエンティティを選択できます。 HibernateはタイプObject[].
の配列を返します
select
account,
client
from Account account, Client client
where account.fkClient = client.pkClient
Hibernate 5.1 を使用すると、マッピングがデータベーステーブルの関係を反映していなくても、エンティティを結合できるようになりました。
したがって、このHQLクエリはHibernate5.1から有効です。
select
account,
client
from Account account
join Client client on account.fkClient = client.pkClient
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
次を使用できます。
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