java - 带有 QueryDSL 的 Postgresql 数组函数

标签 java sql postgresql hibernate querydsl

我使用 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/

相关文章:

java - 使用 Tomcat 上下文资源定义 JDBC 连接 : Hiding connection credentials

sql - 用于在数据库中查找用户的 SQL 查询的性能

sql - 使用来自多个类别的数据连接表格

postgresql - Postgres 相当于 Sql Servers @@DBTS

java - 声明成员类变量并实例化它们

java - 什么是NullPointerException,我该如何解决?

java - 抛出新的 NullPointerException VS 在 null 对象上调用方法

c# - 索引超出范围。必须是非负数且小于集合的大小

sql - 使用 SQLite 从 n 中查找连续的行

postgresql - PostreSQL8.4如何获取字段并添加到group by中?