У меня есть такой оператор 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 ()]
Каково решение, чтобы принять пустой список?
Ответ 1 · рейтинг 5 · Alex Gitelman
Одним из решений, которое я использовал, было бы размещение некоторого фиктивного значения в списке вместе с вашим вводом, чтобы гарантировать, что он никогда не будет пустым. Конечно, вы можете сделать это, только если можно выбрать фиктивное значение.
Если ваш список ввода typeNamesOrig:
List<String> typeNames = new ArrayList<String>(typeNamesOrig);
typeNames.add("valueThatDoesNotExistForSure");
query.setParameterList("typeNames",typeNames);
Ответ 2 · рейтинг 15 · Ted Naleid
Если typeNames пуст/нуль, я, вероятно, не буду выполнять запрос:
if (typeNames) result = Foo.executeQuery("select ... where e.type.name in :typeNames", [typeNames: typeNames)
Ответ 3 · рейтинг 1 · Dayoung
Вы можете установить список :typeNames как null, если массив пуст.
if(typeNames.isEmpty()) typeNames = null
// Call Query
Ответ 4 · рейтинг -1 · Nactive
Фиктивное значение, безусловно, является самым простым решением, за исключением того, что вы никогда не знаете наверняка, что значение не существует. Лучшее, что вы можете сделать, это добавить еще одну переменную, чтобы указать, что список пуст.
select *
from books
where id in (:ids) and :listHasItems = 1
если в вашем списке нет элементов, просто добавьте к нему случайный идентификатор и установите для listHasItems значение 0.