HQL Где IN для пустого списка вылетает
У меня есть заявление 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 ()]
Какое решение сделать это принять пустой список?
3 ответа
Одним из решений, которое я использовал, было бы поместить какое-нибудь фиктивное значение в список вместе с вашим вводом, чтобы оно никогда не было пустым. Конечно, вы можете сделать это, только если будет выбрано фиктивное значение.
Если ваш входной список typeNamesOrig
:
List<String> typeNames = new ArrayList<String>(typeNamesOrig);
typeNames.add("valueThatDoesNotExistForSure");
query.setParameterList("typeNames",typeNames);
Если typeNames пусто / пусто, я, вероятно, не выполню запрос:
if (typeNames) result = Foo.executeQuery("select ... where e.type.name in :typeNames", [typeNames: typeNames)
You can set:typeNames list as null if array is empty.
if(typeNames.isEmpty()) typeNames = null
// Call Query
Фиктивное значение, безусловно, является самым простым решением, за исключением того, что вы никогда не знаете наверняка, что значение не существует. Лучше всего добавить еще одну переменную, чтобы указать, что список пуст.
select *
from books
where id in (:ids) and :listHasItems = 1
если в вашем списке нет элементов, просто добавьте в него случайный идентификатор и установите для listHasItems значение 0.