一尘不染

带有QueryDSL的Postgresql数组函数

hibernate

我使用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>));

阅读 330

收藏
2020-06-20

共1个答案

一尘不染

  1. 第一步是生成适当的sql: WHERE tags @> '{"someTag","anotherTag"}'::text[];
  2. 第二步由coladict描述(非常感谢!):找出被调用的函数:@>是arraycontains和:: text []是string_to_array
  3. 第三步是正确调用它们。经过数小时的调试,我发现HQL不会将函数视为函数,除非我添加了一个表达式符号(在我的情况下:… = true),所以最终的解决方案如下所示:predicate.and(Expressions.booleanTemplate("arraycontains({0}, string_to_array({1}, ','))=true", entity.tags, tagsStr)); 其中tagsStr-是一个String用值分隔的值,
2020-06-20