2013-03-28 25 views
5

tôi có hai thực thể ngủ đông ở đây với chú thích:Làm cách nào để thực hiện việc này * từ hai truy vấn bảng được nối kết trong biểu mẫu HQL?

@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; 
    } 

    ... 
} 

Mối quan hệ là một-nhiều mà một khách hàng có nhiều tài khoản. Bảng ACCOUNT có khóa ngoài (FK_CLIENT) để bàn khóa chính của CLIENT (PK_CLIENT).

Tôi muốn thực hiện truy vấn này ở dạng HQL:

select * from ACCOUNT a inner join CLIENT b on a.FK_CLIENT = b.PK_CLIENT 

bình này, tất cả tài sản từ tài khoản và thực thể khách hàng sẽ được lựa chọn.

Bất kỳ ai biết cách tạo truy vấn đó dưới dạng HQL?

AFAIK, trong HQL, chúng tôi chỉ có thể chọn một thực thể.

Lưu ý:
Tôi không thể sử dụng ánh xạ @ManyToOne trong thực thể Tài khoản vì đã có thuộc tính fkClient và tôi không thể thay đổi điều này vì get/setFkClient đã được sử dụng ở những nơi khác.

Mã ở trên đã được đơn giản hóa bằng cách xóa các phần không liên quan để dễ đọc hơn. Nếu bạn tìm thấy lỗi đánh máy, vui lòng cho tôi biết trong phần nhận xét vì tôi đã nhập mã theo cách thủ công.

+2

Nếu bạn không thể làm một bản đồ để biết ngủ đông mà những hai có liên quan sau đó ngủ đông không thể giúp bạn. Trước tiên bạn sẽ phải chọn các đối tượng 'Account' của bạn sau đó tạo một' Collection' của các id 'Client' từ chúng và thực hiện một lựa chọn khác. Trong mọi trường hợp, đây không phải là cách hoạt động của công thức ngủ đông, đọc trên [mối quan hệ đơn giản] (http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/mapping.html). Tài khoản 'của bạn cần phải có tham chiếu đến một' Client' _object_, ** không ** khóa ngoài. Đó là sau đó công việc của hibernate để cư mà tham chiếu đối tượng từ cơ sở dữ liệu. –

+0

duh, vì vậy không có giải pháp nào cả với hibernate? Tôi không thể thêm ánh xạ mà không vi phạm các mã khác. – null

Trả lời

14

Vâng, bạn có thể chọn một số đơn vị với HQL. Hibernate sẽ trả về một mảng kiểu Object[].

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

cảm ơn, nó hoạt động. Tôi đã tạo mã gọi tên làQuery, nhưng tôi không biết phải đặt mã ở đâu? Tôi có AccountDao và ClientDao bean (ứng dụng được xây dựng với spring + hibernate). Bạn nghĩ tôi nên đặt mã ở đâu? AccountDao hoặc ClientDao hoặc tạo một bean khác? – null

+1

Tôi không nghĩ bạn nên tạo một loại đậu khác. IMHO, nó không thực sự quan trọng bạn đặt nó trong AccountDoa hoặc ClientDao. –

0

Bạn có thể sử dụng:

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

Vui lòng thêm một số chi tiết. Với điều đó, một người truy cập sẽ tìm thấy câu trả lời của bạn hữu ích hơn. – Jayan

2

Với Hibernate 5.1, đó là bây giờ có thể tham gia các đơn vị ngay cả khi ánh xạ không phản ánh mối quan hệ bảng cơ sở dữ liệu.

Vì vậy, truy vấn HQL này có hiệu lực từ Hibernate 5.1:

select 
    account, 
    client 
from Account account 
join Client client on account.fkClient = client.pkClient 
Các vấn đề liên quan