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;
}
Bạn có ý gì khi kết hợp các phương pháp tiếp cận? –
Vui lòng hiển thị một số mã cho phương pháp "kết hợp". –