我使用 Vlad Mihalcea 的库将 SQL 数组(在我的例子中是 Postgresql)映射到 JPA。然后假设我有一个实体,例如。
@TypeDefs(
{@TypeDef(name = "string-array", typeClass =
StringArrayType.class)}
)
@Entity
public class Entity {
@Type(type = "string-array")
@Column(columnDefinition = "text[]")
private String[] tags;
}
合适的 SQL 是:
CREATE TABLE entity (
tags text[]
);
我想使用 QueryDSL 获取标签包含所有给定标签的行。原始 SQL 可以是:
SELECT * FROM entity WHERE tags @> '{"someTag","anotherTag"}'::text[];
(取自:https://www.postgresql.org/docs/9.1/static/functions-array.html)
是否可以使用 QueryDSL 来实现?类似于下面的代码?
predicate.and(entity.tags.eqAll(<whatever>));
最佳答案
第一步是生成正确的 sql:
WHERE tags @> '{"someTag","anotherTag"}'::text[];
第二步由 coladict 描述(非常感谢!):找出调用的函数:@> 是 arraycontains 和::text[] 是 string_to_array
第三步是正确调用它们。经过几个小时的调试,我发现 HQL 不会将函数视为函数,除非我添加了一个表达式符号(在我的例子中:...=true),所以最终的解决方案如下所示:
predicate.and( Expressions.booleanTemplate("arraycontains({0}, string_to_array({1}, ',')) = true", entity.tags, tagsStr) );
其中 tagsStr
- 是一个 String
,其值由 ,
分隔
关于java - 带有 QueryDSL 的 Postgresql 数组函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48280413/