Это перестало работать:
List<String> names = new ArrayList<String>();
names.add("sold");
Query query = em.createQuery("FROM PropField propField WHERE propField.name IN (?)");
query.setParameter(1, names);
List<PropField> fields = query.getResultList();
И так это:
List<String> names = new ArrayList<String>();
names.add("sold");
Query query = em.createQuery("FROM PropField propField WHERE propField.name IN (?)");
query.setParameter(1, names.toArray());
List<PropField> fields = query.getResultList();
Это, также:
List<String> names = new ArrayList<String>();
names.add("sold");
Query query = em.createQuery("FROM PropField propField WHERE propField.name IN ?");
query.setParameter(1, names.toArray());
List<PropField> fields = query.getResultList();
И любая перестановка вышеупомянутого. Проверенный в документах и этом говорится, что первая опция должна работать. Вот исключение для лучшего.
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String
at org.hibernate.type.StringType.toString(StringType.java:67)
Использование HQL Hibernate setParameterList
, но пытаясь придерживаться прямого JPA здесь.
Я столкнулся с аналогичной проблемой с Hibernate, используя именованный запрос JPA с предложением IN. Я получил его работу с синтаксисом: "propField.name IN (? 1)"
См. Также: http://opensource.atlassian.com/projects/hibernate/browse/HHH-4922
и http://opensource.atlassian.com/projects/hibernate/browse/HHH-5126
У меня нет доступа к среде гибернации, чтобы попробовать это, но вы пробовали
Query query = em.createQuery("FROM PropField propField WHERE propField.name IN elements(?)");
query.setParameter(1, names);
Из спецификации JPA 1.0:
4.6.4.1 Позиционные параметры
К позиционным параметрам применяются следующие правила.
- Входные параметры обозначаются префиксом вопросительного знака (?), За которым следует целое число. Например:
? 1
.- Входные параметры нумеруются, начиная с 1.
Обратите внимание, что один и тот же параметр может использоваться более одного раза в строке запроса и что порядок использования параметров в строке запроса не обязательно должен соответствовать порядку позиционные параметры.4.6.4.2 Именованные параметры
Именованный параметр - это идентификатор, которому предшествует символ «:». Он следует правилам для идентификаторов, определенным в разделе 4.4.1. Именованные параметры чувствительны к регистру.
Пример:
ВЫБРАТЬ c ОТ Заказчика c ГДЕ c.status =: stat
Раздел 3.6.1 описывает API для привязки именованных параметров запроса
Поэтому либо используйте (с именованным параметром):
List<String> names = Arrays.asList("sold");
Query query = em.createQuery("FROM PropField propField WHERE propField.name IN (:names)");
query.setParameter("names", names)
List<PropField> fields = query.getResultList();
, либо (с позиционным параметром):
List<String> names = Arrays.asList("sold");
Query query = em.createQuery("FROM PropField propField WHERE propField.name IN (?1)");
query.setParameter(1, names)
List<PropField> fields = query.getResultList();
Оба тестировались с Hibernate EM 3.4 .0.GA.
Обратите внимание, что принудительное использование скобок для заключения параметра в предложение IN является ошибкой (по крайней мере, в JPA 2.0), как указано в в предыдущем ответе .