У меня есть SQL-запрос
select t.id as id, t.color as color from test_data t where t.id = ANY(?1) and t.color=?2
как я могу передать массив значений в ANY(?1)
то есть
em.createNamedQuery("Test.getTestData", Tuple.class)
.setParameter(1, arrayOfIds<----___can_I_pass_an_array___?____)
.setParameter(2, yellow)
.unwrap(NativeQuery.class)
.addScalar("id", LongType())
.addScalar("color", new StringType())
я получаю сообщение об ошибке
Caused by: org.postgresql.util.PSQLException: ERROR: op ANY/ALL (array) requires array on right side
Position: 507
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2553) ~[postgresql-42.2.18.jar!/:42.2.18]
Я вижу два возможных пути:
= ANY(?1)
в in (?1)
. Как объяснил здесь, они имеют одинаковое значение. А затем передайте List<Long>
вместо Long[]
:List<Long> ids = new ArrayList<>();
List<Object[]> result = em.createNativeQuery(
"select id, color from test_data where id in (:ids)")
.setParameter("ids", ids)
.getResultList();
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>2.10.1</version>
</dependency>
если вы используете hibernate 5.4, 5.3 или 5.2, а затем перепишите свой запрос следующим образом:
import com.vladmihalcea.hibernate.type.array.LongArrayType;
Long[] ids = {1L, 3L};
List<Object[]> result = em.createNativeQuery(
"select id, color from test_data where id = ANY(:ids)")
.unwrap(org.hibernate.query.NativeQuery.class)
.setParameter("ids", ids, LongArrayType.INSTANCE)
.getResultList();
Вместо добавления дополнительной зависимости вы также можете написать свой hibernate кастомный базовый тип, но без соответствующего опыта это может быть довольно проблематично.
попробовал ваше второе предложение. Получение той же ошибки. Вызвано: org.postgresql.util.PSQLException: ОШИБКА: op ANY/ALL (массив) требует массива с правой стороны
Извините, после просмотра изменений кажется, что все работает как положено. Спасибо.
И это также работает с NamedNativeQuery (только что протестировано)
Спасибо за ваш ответ, будет ли это работать, если я буду использовать NamedNativeQuery, а не простой нативный запрос?