我目前正在尝试实现一个通用查询生成器,该生成器可以重复用于不同的实体。我正在使用 Blaze Persistence 来组装查询。生成器必须支持的选项之一是检查 List 属性是否包含给定值。因此,在伪代码中,这意味着 Entity.Attribute.contains(passedValue)。我现在正在努力让这个查询工作。我创建了一个包含以下字段的视图
@Type(ListArrayType.class)
@Column(name = "co_creators", columnDefinition = "UUID[]")
private List<UUID> coCreators;
这是这样创建的
COALESCE(
(SELECT ARRAY_AGG(cc.cocreatorid)
FROM cocreator cc
WHERE cc.elementid = c.id
AND cc.elementtype = 'COURSE'),
'{}'
) AS co_creators
然后,我尝试按以下方式组合查询,但没有任何效果按预期进行:
- 其中(值).in(字段名称)
restrictionBuilder = criteria.where(queryParams.getValue().toString());
restrictionBuilder.in(queryParams.getFieldName());
这将导致
com.blazebit.persistence.parser.expression.SyntaxErrorException: Could not parse expression '7035bf82-a831-4a78-8615-6cc0e0c1ca26', line 1:4 mismatched input 'bf82' expecting {<EOF>, '+', '-', '*', '/', '%', '||'}
- 将值设置为参数
restrictionBuilder = criteria.where(":value");
restrictionBuilder.in(queryParams.getFieldName());
criteria.setParameter("value", queryParams.getValue().toString());
这将创建一个如下查询:
SELECT selectedObject FROM CourseView selectedObject WHERE :value IN (:param_0) ORDER BY selectedObject.uuid DESC
这似乎是正确的,但是如果我有一个带有 coCreators 字段的实体,例如:
{7035bf82-a831-4a78-8615-6cc0e0c1ca26}
并作为我的值传递,'7035bf82-a831-4a78-8615-6cc0e0c1ca26'
它将返回一个空列表,但我希望找到上述条目。
- 使用 FUNCTION
我也试过
restrictionBuilder = criteria.where("FUNCTION('any', :value, coCreators)");
criteria.setParameter("value", queryParams.getValue().toString());
然而这导致Resolved [java.lang.IllegalArgumentException: Parameter name "value" does not exist]
- 使用不带参数的 FUNCTION
然后我尝试了同样的方法setParameter
,比如
restrictionBuilder =
criteria.where("FUNCTION('any', " + queryParams.getValue().toString() + ", coCreators)");
criteria.setParameter("value", queryParams.getValue().toString());
最终结果和SyntaxErrorException
我的第一个选择一样
- 逃逸值
也可以像这样转义值
restrictionBuilder = criteria.where("FUNCTION('any', '" + queryParams.getValue().toString() + "', coCreators)");
不会有帮助。这将导致
ExceptionHandlerExceptionResolver : Resolved [com.blazebit.persistence.impl.BuilderChainingException: A builder was not ended properly.]
- 转义值
eq(true)
然后我尝试了这个
restrictionBuilder =
criteria.where("FUNCTION('any', '" + queryParams.getValue().toString() + "', coCreators)");
restrictionBuilder.eq(true);
因为任何都应该返回一个布尔值,但是这也不能解决问题,因为它导致:
Caused by: org.postgresql.util.PSQLException: ERROR: invalid input syntax for type boolean: "7035bf82-a831-4a78-8615-6cc0e0c1ca26"
Position: 562
我完全迷失了方向,非常希望得到一些帮助。有没有办法使用 Blaze Persistence 按照我需要的方式工作?
我认为一个选项是使用本机查询,但是必须能够仅对此条件使用本机查询,但将其与其他(非本机)条件相结合。但是,我也不知道如何在 Blaze Persistence 中包含自定义查询/条件。