JPA выполняет часть запроса, если значение не является нулевым - PullRequest
6 голосов
/ 02 мая 2011

в Java следующая распространенная идиома:

if( null != obj && obj.getSomeNumber() > 0 ) { ... }

Это будет выполнять проверку длины, только если null! = Obj true.Однако в JPA NamedQuery это не работает:

@NamedQuery(
name = "query"
query = "SELECT o FROM SomeObjectList o WHERE o.someObject is not null AND o.someObject.someNumber > 0")

(это то, что я ожидал, поскольку это также не будет работать в SQL.)

o.someObject либо'null' или внешний ключ к таблице, в которой хранятся SomeObjects.(Каждый столбец таблицы соответствует атрибуту SomeObject.)

-------------------------           ----------------------------
| Table: SomeObjectList |           |    Table: SomeObject     |
-------------------------           ----------------------------
|  id   |   someObject  |           |  id    |  number |  name |
-------------------------           ----------------------------
|   1   |        4      |           |   3    |    -4   | foo   |
-------------------------           ----------------------------
|   2   |       null    |           |   4    |     2   |  bar  |
-------------------------           ----------------------------

Поэтому я хотел бы создать NamedQuery, который будет возвращать все объекты из SomeObjectList, у которых либо нет объекта (someObject == null)или где SomeObject.number> 0. В настоящее время я получаю все объекты и проверяю себя, установлен ли someObject.

Но есть ли способ получить аналогичное поведение в JPA или мне нужно выполнить проверки навозвращенные объекты?

edit: добавлена ​​графика и устранена проблема.(Спасибо Джеймсу.)

Ответы [ 2 ]

9 голосов
/ 03 мая 2011

Для этого вам нужно использовать внешнее объединение.

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

SELECT o FROM SomeObjectList o left join o.someObject so WHERE o.someObject is null OR so.someNumber > 0
1 голос
/ 02 мая 2011

Не уверен, что понимаю?

Вам даже не нужно "not null", просто длина> 0 не вернет true для null?

Также ваш код неверен, длина - это функция, а не навигация.

Так и должно быть,

SELECT o FROM SomeObject o WHERE LENGTH(o.arry) > 0

Или arry - это коллекционные отношения? В этом случае вам потребуется использовать SIZE, и объединение также отфильтрует отсутствующие отношения.

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