2010-02-24 2 views
2

는 내가 가진 :HQL nullable 속성을 무시하면 안됩니다. 도움이됩니까?

Class Foo 
{ 
String name; 
String value; 
Foo parent; //Foo.parent is OneToOne and nullable 
} 

나는 다음 HQL 있습니다 f.parent가 null 때까지

FROM Foo f WHERE 
(lower(f.name) like concat(lower('string') , '%')) or 
(lower(f.value) like concat(lower('string') , '%')) or 
(lower(f.parent.name) like concat(lower('string') , '%')) 

쿼리는 잘 작동합니다. f.name 또는 f.value가 일치하는 경우에도 f.parent가 null이면 결과가 버려집니다.

그래서 내가 가지고 말 :

Foo a = new Foo(); 
a.name = "bob"; 
a.value = "chris"; 
a.parent = null; 

Foo b = new Foo(); 
b.name = "Bob"; 
b.value="Chris"; 
b.parent = a; 

나는 "B"를 검색 만 b는 반환됩니다. 나는 a와 b가 반환되도록 그것을 원한다.

팁이 있습니까?

감사합니다.

답변

1

쿼리에서 f.parent.name을 참조하면 부모 속성에 암시 적으로 inner join이 생성됩니다. 그들은 부모가 없기 때문에 가입 할 수없는 행을 포함하려면, 당신은 명시 적으로 left outer join 대신 사용해야합니다 : 대답 마틴

from Foo f 
left outer join f.parent as p 
where 
(lower(f.name) like concat(lower('string') , '%')) or 
(lower(f.value) like concat(lower('string') , '%')) or 
(lower(p.name) like concat(lower('string') , '%')) 

Related HQL documentation

+0

감사합니다. 오라클을 사용 중이며 다음과 같은 오류가 발생합니다 : ORA-00918 : 애매한 열 정의 이 방법이 있습니까? 도움에 감사드립니다! – KyleT