Bezdepbonusu7Программирование: статьи и ответы

Вопрос

HQL Где IN для пустого списка вылетает

Автор вопроса: DerekОтветов: 4

У меня есть такой оператор 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 ()]

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

  • каким должно быть поведение, если список пуст - получить все или ничего? aishwarya 09.12.2011
  • Он не должен возвращать никаких результатов, если есть пустой список Derek 09.12.2011
  • Разве вы не можете просто проверить список, прежде чем передавать его в качестве аргумента в запрос HQL? Я считаю, что HQL просто отражает поведение SQL, который также выдаст ошибку, если вы попытаетесь выполнить запрос IN ()? sbrattla 10.12.2011
  • @ Дерек, я согласен с Тедом. если вы ищете пустой список в этом условии, зачем вообще выполнять запрос :-) aishwarya 10.12.2011
  • В Hibernate jira есть (в настоящее время) открытая ошибка, связанная с пустой проблемой IN(): hibernate.atlassian. сеть/обзор/HHH-8091 omnomnom 29.03.2013

javagrailsgroovyhql

Ответы

Ответ 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.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы