Обнуляемое свойство HQL не следует игнорировать, помогите? - PullRequest
2 голосов
/ 25 февраля 2010

у меня есть:

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

У меня есть следующий HQL:

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.parent не станет нулевым. Даже если f.name или f.value совпадают, когда f.parent равен нулю, результат отбрасывается.

Так скажи, что у меня есть:

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 Ответ

1 голос
/ 25 февраля 2010

Ссылка 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') , '%' ))

Связанная документация по HQL

...