Я использую 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 [], потому что он используется для других...
У вас есть переменная типа 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));
Object[]
, просто приведите его внутри метода.