2012-10-01 30 views
6

Tôi đã viết truy vấn HQL như thế này:Làm thế nào để tránh kiểu cũ bên ngoài tham gia (+) trong Hibernate?

SELECT a FROM A a LEFT JOIN a.b where ... 

Hibernate tạo truy vấn sql như thế này:

SELECT a FROM A a LEFT JOIN a.b where a.b_id = b.id(+) 

Nhưng khi tôi viết một cái gì đó như thế này:

SELECT a FROM where a.b.id > 5 

Nó tạo ra SQL :

SELECT a.* FROM A b cross join B b where b.id > 5 

Vì vậy, khi tôi kết hợp này phương pháp tiếp cận tôi nhận Oracle LỖI:

SQL Error: 25156, SQLState: 99999 
ORA-25156: old style outer join (+) cannot be used with ANSI joins 

Vậy có cách nào để nói cho Hibernate mà tôi muốn nhận được chỉ có một loại truy vấn (kiểu cũ hay mới)?

UPDATE: Bằng cách kết hợp Ý tôi là HQL truy vấn như thế này:

SELECT alarm FROM Alarm as a LEFT JOIN alarm.madeBy as user where user.name = 'George' and a.source.name = 'UFO' 

Vì vậy, ở đây tôi xác định rằng Alarm phải được kết nối với tài với LEFT JOIN, và không chỉ định cách kết nối Báo động với Nguồn, vì vậy Hibernate sẽ kết nối với Cross Join.

Và SQL Query sẽ như thế này:

FROM Alarms a, Users u cross join Sources s where a.user_id = u.user_id(+) and a.source_id = s.source_id and u.name = 'George' and s.name = 'UFO' 

Để hiểu rõ hơn tôi sẽ bổ sung thêm ví dụ nhỏ của Entity báo thức: Phương ngữ

@Entity 
@Table(name = 'Alarms') 
public class Alarm { 
    @Id 
    private BigDecimial id; 

    @ManyToOne 
    @JoinColumn(name = "user_id") 
    private User madeBy; 

    @ManyToOne 
    @JoinColumn(name = "source_id") 
    private Source source; 
} 
+0

Bạn có ý gì khi kết hợp các phương pháp tiếp cận? –

+0

Vui lòng hiển thị một số mã cho phương pháp "kết hợp". –

Trả lời

6

Vì vậy, việc giải quyết vấn đề này được thiết lập chế độ ngủ đông để org .hibernate.dialect.Oracle9Dialect

<property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property> 
+1

rất hữu ích. cám ơn vì đã chia sẻ. –

0

Tôi hiểu rằng bạn cố gắng lấy SQL truy vấn dưới đây bằng cách sử dụng HQL.

SELECT a.* FROM A ,B where a.b_id = b.id(+) and b.id > 5 

Thứ nhất, bạn không bao giờ nên sử dụng mã như thế a.b.XX tại HQL của bạn.
mã mẫu là

SELECT a FROM A a LEFT JOIN a.b where b.id is null or (b.id is not null and b.id > 5) 

sau đó ngủ đông genarates một truy vấn SQL mà không gây ra một ngoại lệ.

Các vấn đề liên quan