我正试图在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(",")))))