2012-10-01 12 views
6

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; 
} 
+0

Co masz na myśli, łącząc podejście? –

+0

Proszę podać kod dla "połączonego" podejścia. –

Odpowiedz

6

Więc rozwiązywania tego problemu jest ustawiony w stan hibernacji do org .hibernate.dialect.Oracle9Dialect

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

bardzo pomocne. dzięki za udostępnienie. –

0

Rozumiem, że próbujesz uzyskać SQL zapytanie poniżej za pomocą HQL.

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

Po pierwsze, nigdy nie należy używać kodu podobnego tej a.b.XX w swojej HQL.
kod próbka

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

następnie hibernacji genarates do zapytań SQL, aby nie spowodował wyjątek.

Powiązane problemy