Hibernate Named Query, исключая нулевые значения - PullRequest
0 голосов
/ 05 марта 2011

Я использую следующий именованный запрос для получения результатов из базы данных на основе параметров, которые я передаю со страницы JSP.

<query name="getData"><![CDATA[
select
    a.name,a.desc,a.reportname,b.manname,b.mandata
from
    product as a inner join
    a.manufacturer as m
where
    m.name like :manufacturer and
    a.description like :description and
    ((a.percentSize <= :sizeMax and
    a.percentSize >= :sizeMin) or
    a.percentSize is null) and
    ((a.wingSpanInches <= :spanMax and
    a.wingSpanInches >= :spanMin) or
    a.wingSpanInches is null) and
    ((a.recommendedAuwMinLbs <= :auwMax and
    a.recommendedAuwMaxLbs >= :auwMin) or
    a.recommendedAuwMaxLbs is null)
]]></query>

Не все параметры поиска являются обязательными (некоторые значения, которые я получаю, являютсяноль).Как исключить параметры, если они нулевые?

Ответы [ 4 ]

1 голос
/ 06 марта 2011

Вы можете использовать findByExample().
Если объект имеет поле с нулевым значением, он не включается в сгенерированный оператор SQL where.

Однако это означает, что вы не можете использовать именованный запрос.

0 голосов
/ 23 июня 2011

Это возможно, если вы добавите дополнительную переменную, например.: active, тогда ваш запрос должен выглядеть примерно так:

...
where
(m.name like :manufacturer and 1 = :active) or
(m.name like :manufacturer and a.description like :description  and 2 = :active) or
(m.name like :manufacturer and a.description like :description and a.percentSize <= :sizeMax and 3 = :active) or ...

И так далее ... С помощью: active вы можете позже решить, какой из аргументов должен «подсчитываться».Или ничего не делать, установив: active to eg null.

Вы поняли идею?

0 голосов
/ 06 марта 2011

Вы действительно не должны делать запросы прямо со страницы JSP.Ой.

Вы должны установить каждый параметр (по крайней мере, вы делаете это с PostgreSQL), но все равно можно установить их на ноль.Если они равны NULL, у вас уже есть запрос, который будет работать правильно и не будет применять соответствующий тест.

Итак, вам просто нужно убедиться, что все параметры переданы, а для любых необязательных параметров установлено значениеноль, если они не указаны.

0 голосов
/ 05 марта 2011

Вы не можете сделать это.Вам нужно будет построить запрос динамически (используя StringBuilder).

if (firName != null) {
    sb.append(" WHERE ....");
}

session.createQuery(sb.toString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...