【问题标题】:Native Query with array in JPAJPA中带有数组的本机查询
【发布时间】:2020-09-05 14:19:36
【问题描述】:
我想进行查询验证 Postgres 中包含的数组中的值。我在 JPA 中做了一个 nativeQuery,查询显然是正确的,并且在 DBeaver(DBM) 中工作,但在 java 应用程序中没有。
,
ERROR: operator does not exist: integer[] @> character varying
TIP: No operator matches the name and type of the argument. You need to add explicit type conversions.
【问题讨论】:
标签:
java
postgresql
hibernate
jpa
nativequery
【解决方案1】:
AFAIK 这在本机查询中不受支持,因为它们直接委托给不支持它的 JDBC 驱动程序。
当您像这样使用 JPQL 时:
var query = em.createQuery("select p from Person p where p.name in :names", Person.class);
query.bind("names", List.of("A", "B");
然后检查生成的原生 SQL,然后你会看到,生成的 SQL 看起来是这样的:
select .. from person where person.name in (?, ?)
在您的情况下,我担心您将不得不使用以下内容动态生成查询:
var entries = List.of("A","B");
var sql = new StringBuilder("select ... from person where person.name in (");
for (var i=0; i<entries.size(); i++) {
sql.append('?');
if (i<entries.size()-1) sql.append(',');
}
sql.append(')');
var query = em.createNativeQuery(sql.toString());
for (var i=0; i<entries.size(); i++) {
query.setParameter(i+1, entries.get(i));
}