web-dev-qa-db-ja.com

HQL形式の2つの結合されたテーブルクエリから*を選択する方法は?

ここに注釈付きの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が他の場所ですでに使用されているため、これを変更できません。

上記のコードは、関係のない部分を削除して読みやすくすることで簡略化されています。コードを手動で入力したので、タイプミスを見つけた場合は、コメントセクションでお知らせください。

5
null

はい、HQLで複数のエンティティを選択できます。 HibernateはタイプObject[].の配列を返します

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

Hibernate 5.1 を使用すると、マッピングがデータベーステーブルの関係を反映していなくても、エンティティを結合できるようになりました。

したがって、このHQLクエリはHibernate5.1から有効です。

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

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

0
Dev Blanked

次を使用できます。

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 
0
Marcelo Franco