带有QueryDSL的Postgresql数组函数
我使用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
用值分隔的值,
以上是 带有QueryDSL的Postgresql数组函数 的全部内容, 来源链接: utcz.com/qa/397739.html