在queryDSL中使用postgresql数组覆盖运算符的语法



我正试图在queryDSL+JPA中使用postgresql的数组覆盖运算符,使用BooleanBuilder和布尔模板来构建一个查询,但我无法让JPA接受我的查询。我目前的写作方式是

public BooleanBuilder addUUIDListIntersectionCondition(BooleanBuilder clause,
CollectionPath<UUID, ComparablePath<UUID>> arg0, List<UUID> arg1) {
clause.and(Expressions.booleanTemplate("{0} && ARRAY[{1}::UUID]", arg0,
String.join(",", arg1.stream().map(a -> a.toString()).collect(Collectors.toList()))));
}

但这导致了以下异常:

An exception occurred while creating a query in EntityManager: 
Exception Description: Syntax error parsing [select ec
from vw_ec ec
where ec.orgUserIds && ARRAY[?1::UUID]]. 
[76, 193] The expression is not a valid conditional expression.; nested exception is java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Syntax error parsing [select ec
from vw_ec ec
where ec.orgUserIds && ARRAY[?1::UUID]]. 
[76, 193] The expression is not a valid conditional expression.
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:374)
at org.springframework.orm.jpa.DefaultJpaDialect.translateExceptionIfPossible(DefaultJpaDialect.java:128)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)

直接在postgresql中运行类似的查询可以按预期工作:

select *
from ec ec
where (ec.orgUserIds && array['c61d452e-0361-11eb-8ecd-9e48108033fa', 'c623fc2d-0361-11eb-8ecd-9e48108033fa'::UUID])

你知道我哪里错了吗?

我不认为我有干净的解决方案,但它适用于以下查询:

select *
from ...
where '{e48f54d5-9845-4987-a53d-e0ecfe3dbb43,e48f54d5-9845-4987-a53d-e0ecfe3dbb45}'::uuid[] && '{e48f54d5-9845-4987-a53d-e0ecfe3dbb40,e48f54d5-9845-4987-a53d-e0ecfe3dbb45}'::uuid[];

我在booleanTemplate:中使用以下语法

select(...)
.from(...)
.where(new BooleanBuilder().and(Expressions.booleanTemplate("{0} && {1}::uuid[]", arg0, String.format("{%s}", arg1.stream().map(UUID::toString).collect(joining(",")))))