JPA TypedQuery: элемент значения параметра не соответствует ожидаемому типу

1

Я использую JPA 2.0 и имею следующий код в слое DAO:

public void test() {
  String key = "status";
  String[] statuses = {"A", "B"};
  List<TestTable> result = find(key, statuses);
}

public List<TestTable> find(String key, Object valueArr) {
  String sql = "SELECT nd FROM TestTable nd WHERE nd." + key + " IN :" + key;
  TypedQuery<TestTable> query = entityManager.createQuery(sql, TestTable.class);
  query.setParameter(key, Arrays.asList(valueArr))//***Error Line***
  return query.getResultList();
}

В приведенной выше строке ошибок он генерирует следующее исключение:

java.lang.IllegalArgumentException: Parameter value element [[Ljava.lang.String;@cbe5bc] did not match expected type [java.lang.String]

Почему он ожидал тип String, тогда как на самом деле это String []? Пожалуйста помоги!

Примечание. Это извлеченный и упрощенный код из общей процедуры, я не могу изменить "Object valueArr" на String [], потому что он используется для других...

  • 0
    почему вы используете ключ в двух местах в запросе? Выглядит не совсем правильно
Теги:
hibernate
jpa

1 ответ

2

У вас есть переменная типа Object, и вы вызываете Arrays.asList. Это означает, что вы эффективно позвонили:

List<Object> values = Arrays.asList(new Object[] {valueArr});

Таким образом, вы создаете список одного элемента, где этот элемент является массивом. Это не то, что вы хотите... вы хотите, чтобы List<Object> имел столько элементов, сколько вам нужно было начинать. Самый простой способ - изменить тип параметра:

public List<TestTable> find(String key, Object[] values)

...

query.setParameter(key, Arrays.asList(values));
  • 0
    Отличный улов! На самом деле я не могу изменить параметр Object на Object [], вероятно, я попытаюсь с: «Arrays.asList ((Object []) valueArr)», но не уверен, будет ли он работать с примитивными массивами, например, int [] или нет?
  • 0
    @ user3568038: Если вы не можете изменить тип параметра, но вам всегда требуется, чтобы значение было Object[] , просто приведите его внутри метода.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню