HQL Где IN для пустого списка вылетает - PullRequest
6 голосов
/ 09 декабря 2011

У меня есть оператор HQL, например, так:

Select cast(ed.employee.employeeID as int) AS emp_id FROM Education AS ed WHERE ed.type.name IN (:typeNames)

Иногда, однако, typeNames пуст.Это вызывает следующее:

org.hibernate.hql.ast.QuerySyntaxException: unexpected end of subtree [Select cast(ed.employee.employeeID as int) AS emp_id FROM Education AS ed WHERE ed.type.name IN ()]

Какое решение сделать, чтобы принять пустой список?

Ответы [ 4 ]

13 голосов
/ 10 декабря 2011

Если typeNames пусто / пусто, я, вероятно, не выполню запрос:

if (typeNames) result = Foo.executeQuery("select ... where e.type.name in :typeNames", [typeNames: typeNames)
2 голосов
/ 09 декабря 2011

Одним из решений, которое я использовал, было бы поместить какое-нибудь фиктивное значение в список вместе с вашим вводом, чтобы оно никогда не было пустым. Конечно, вы можете сделать это, только если будет выбрано фиктивное значение.

Если ваш список ввода typeNamesOrig:

List<String> typeNames = new ArrayList<String>(typeNamesOrig);
typeNames.add("valueThatDoesNotExistForSure");
query.setParameterList("typeNames",typeNames);
0 голосов
/ 14 мая 2019

Вы можете установить: typeNames list как null, если массив пуст.

if(typeNames.isEmpty()) typeNames = null

// Call Query

0 голосов
/ 06 апреля 2015

Фиктивное значение, безусловно, самое простое решение, за исключением того, что вы никогда не знаете наверняка, что значение не существует.Лучше всего добавить еще одну переменную, чтобы указать, что список пуст.

select *
from books
where id in (:ids) and :listHasItems = 1

, если в вашем списке нет элементов, просто добавьте в него случайный идентификатор и присвойте listHasItems значение 0.

...