gpt4 book ai didi

java - 带有 QueryDSL 的 Postgresql 数组函数

转载 作者:行者123 更新时间:2023-11-29 12:35:29 26 4
gpt4 key购买 nike

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

最佳答案

  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,其值由 , 分隔

关于java - 带有 QueryDSL 的 Postgresql 数组函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48280413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com