Java JPA中带数组的本机查询

Java JPA中带数组的本机查询,java,postgresql,hibernate,jpa,nativequery,Java,Postgresql,Hibernate,Jpa,Nativequery,我想做一个查询来验证Postgres中数组中包含的值。我在JPA中创建了一个nativeQuery,该查询显然是正确的,并且在DBeaver(DBM)中工作,但在java应用程序中不工作 ,, AFAIK在本机查询中不支持这一点,因为它们直接委托给不支持它的JDBC驱动程序 当您使用这样的JPQL时: var query = em.createQuery("select p from Person p where p.name in :names", Person.class); query.

我想做一个查询来验证Postgres中数组中包含的值。我在JPA中创建了一个nativeQuery,该查询显然是正确的,并且在DBeaver(DBM)中工作,但在java应用程序中不工作

,,


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));
}
在您的情况下,我感到震惊,您必须使用以下内容动态生成查询:

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));
}
var条目=列表中的(“A”、“B”);
var sql=newstringbuilder(“从person.name所在的person中选择…”);
对于(var i=0;i