2010-11-23 5 views
0

HQL을 사용한 서브 쿼리에 대한 지원이 부족하다는 점을 읽었습니다.하지만 어쨌든이 SQL 쿼리를 HQL로 구현할 수 있는지 알려주시겠습니까?서브 쿼리가있는 SQL에서 HQL까지

나는 이미 내가 옳은 길에있어 경우

SQL (작업) ...

 

    SELECT 
    foo.id as fooId, 
    foo.name AS fooName, 
    chan.name AS chanName, 
    (SELECT DISTINCT 
     foo_lang.VALUE 
    FROM 
     foo_lang 
    WHERE 
     foo_lang.foo_id = fooId AND 
     foo_lang.lang_id = 1) as EN 
    FROM 
     foo 
    INNER JOIN chan ON foo.chan_id = chan.id 
 

HQL을 (모르는 ... 몇 가지 테스트를하지만 성공을했습니다) 작동하지

 

select new 
    Map(o.id as id, 
     o.name as fooName, 
     c.name as chanName, 
     (select fl.value from foo_lang fl where fl.id.fId = id and fl.id.lId = 1) as EN) 
from 
    foo o 
    left join o.chan c 
 

이 제공하십시오 binar의 왼쪽과 오른쪽 측면 :

org.hibernate.TypeMismatchException을 y 논리 연산자가 호환되지 않음 [big_decimal : component [lId, rId]

서브 쿼리 또는 다른 것에 관한 것입니까?

미리 감사드립니다.

+0

내가이 열린 괄호하지만, 단 하나 명의 가까이를 참조하십시오 당신이 foo_lang이 같은 foo는, 에 가입하면 AFAIK, 논리적으로는 동일합니다. 그것을 고쳐서 시도 했습니까? – Genius

+0

감사합니다. 닫는 대괄호가 추가되었지만 문제가 지속됩니다. – foxtrot

+0

또 하나의 질문 :이 표현식에서 fooId는 무엇입니까? foo_lang.foo_id = fooId AND. 하위 쿼리가 둘 이상의 행을 반환하면 어떻게됩니까? 가능한가? – Genius

답변

0

나는 약간의 다른 객체로 케이스를 재현하려고 노력했으며, 왜이 하위 쿼리가 필요한지 이해하지 못했습니다.

SELECT 
o.id, 
o.name as fooName, 
c.name as chanName, 
fl.value as EN 
FROM foo AS o 
LEFT JOIN o.chan AS c 
LEFT JOIN o.foo_lang AS fl WITH fl.lang_id = 1 
+0

너는 남자 야! :) 감사. – foxtrot

관련 문제