HQL: как в нулевых отношениях - PullRequest
2 голосов
/ 29 марта 2012

У меня есть отношение OneToMany:

public class Class1{

    private String attr1;
    private String attr2;

    @OneToOne
    private Class2 object1;

}

public class Class2{
    private String attr3;    
}

Отношение может хранить нулевые объекты (я имею в виду, что экземпляр Class1 может иметь значение null в object1).Я хочу выполнить полный поиск по всем атрибутам, поэтому я создал этот запрос HQL:

SELECT p FROM Class1 p
WHERE 
(
upper(p.attr1) LIKE :filter OR
upper(p.attr2) LIKE :filter OR
upper(p.object1.attr3) LIKE :filter
)

, и я передаю строковый параметр в верхнем регистре с "%" до и после:

query.setParameter("filter", "%"+filter.trim().toUpperCase()+"%");

Работает нормально, но для сущностей, у которых object1 = null.Это никогда не получит те лица.Действительно, если я удаляю последнее условие (верхнее (p.object1.attr3) LIKE: filter), оно работает, но мне нужно его включить.

Хотя я должен выполнить LEFT JOIN с этим отношением, поэтому яЯ пытался написать это как:

SELECT p FROM Class1 p LEFT JOIN p.object1 AS p1
WHERE 
(
upper(p.attr1) LIKE :filter OR
upper(p.attr2) LIKE :filter OR
upper(p1.attr3) LIKE :filter
)

или как

SELECT p FROM Class1 p LEFT JOIN p.object1 AS p1
WHERE 
(
upper(p.attr1) LIKE :filter OR
upper(p.attr2) LIKE :filter OR
(p1 is not null AND upper(p1.attr3) LIKE :filter)
)

, но безуспешно.

Есть идеи?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 29 марта 2012
SELECT p FROM Class1 p
WHERE
upper(p.attr1) LIKE :filter OR
upper(p.attr2) LIKE :filter OR
UNION
SELECT p FROM Class1 p LEFT JOIN p.object1 AS p1
WHERE
upper(p1.attr3) LIKE :filter
2 голосов
/ 29 марта 2012

Как я понимаю, вам нужны значения либо p1.attr3 is null, а когда оно равно not null, оно должно проверить условие Итак, я просто настраиваю ваш последний запрос;

SELECT p FROM Class1 p LEFT JOIN p.object1 AS p1
WHERE 
(
upper(p.attr1) LIKE :filter OR
upper(p.attr2) LIKE :filter OR
(p1.attr3 is null OR upper(p1.attr3) LIKE :filter)
)
2 голосов
/ 29 марта 2012

Вы должны использовать внешнее соединение!

Например:

SELECT p FROM Class1 p OUTER JOIN p.object1 AS p1
   WHERE ... ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...