ja napisałem zapytań HQL tak:Jak uniknąć łączenia zewnętrznego w starym stylu (+) w trybie hibernacji?
SELECT a FROM A a LEFT JOIN a.b where ...
Hibernate generować zapytania sql tak:
SELECT a FROM A a LEFT JOIN a.b where a.b_id = b.id(+)
Ale gdy piszę coś takiego:
SELECT a FROM where a.b.id > 5
generować SQL :
SELECT a.* FROM A b cross join B b where b.id > 5
Więc kiedy łączę ten zbliża I odbieranie Oracle błąd:
SQL Error: 25156, SQLState: 99999
ORA-25156: old style outer join (+) cannot be used with ANSI joins
Więc jest tam droga do powiedzenia hibernacji, że chcę otrzymywać tylko jeden rodzaj zapytań (stary styl lub nowy)?
UPDATE: Łącząc Znaczy HQL kwerendy tak:
SELECT alarm FROM Alarm as a LEFT JOIN alarm.madeBy as user where user.name = 'George' and a.source.name = 'UFO'
Więc tutaj określić, które Alarm należy wiązać z Użytkownika z LEFT JOIN, a nie określenie sposobu podłączenia Alarm z Źródło, więc Hibernate połączy go z Cross Join.
I zapytań SQL będzie tak:
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'
Więcej zrozumienia dodam mały przykład jednostki Alarm: dialekt
@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;
}
Co masz na myśli, łącząc podejście? –
Proszę podać kod dla "połączonego" podejścia. –