【问题标题】:How to pass String[] as varchar[] through Querydsl to PostgreSQL?如何通过 Querydsl 将 String[] 作为 varchar[] 传递给 PostgreSQL?
【发布时间】:2020-03-10 19:06:47
【问题描述】:

尝试更干净地解决Postgresql Array Functions with QueryDSL,我已经到此为止了。

// obj.foo is an ArrayPath<String[], String>
bindings.bind(obj.foo).first((path, value) -> 
        Expressions.booleanTemplate("arraycontains({0}, {1}) = true", path, value));

这最终成为看起来正确的 SQL

where arraycontains(obj0_1_.foo, ?)=true

但似乎String[] 变量未正确传递

org.postgresql.util.PSQLException: ERROR: function arraycontains(character varying[], bytea) 不存在

我该怎么做(如果可能的话)

  1. String[] 值绑定为varchar[]
  2. booleanTemplate中表达必要的演员表?

【问题讨论】:

  • 经过一些调试,绑定值是StreamWrapper,我认为是String[]的Java序列化@ - AC ED 00 05 75 74 00 ...
  • 此外,Arrays.asList(value) 绑定为 varchar 用于单个项目,record 用于多个。

标签: postgresql hibernate spring-data-jpa querydsl


【解决方案1】:

不要直接传递String[],而是将其包装在TypedParameterValue中。

hibernate-types 库确实有 not yet support varchar[],但您可以使用它来构建一些功能:

public class VarcharArrayType extends AbstractHibernateType<String[]> {
    public static VarcharArrayType INSTANCE = new VarcharArrayType();

    public VarcharArrayType() {
        super(ArraySqlTypeDescriptor.INSTANCE, new TypeDescriptor());
    }

    public String getName() {
        return "varchar-array";
    }

    public static class TypeDescriptor extends StringArrayTypeDescriptor {
        @Override
        protected String getSqlArrayType() {
            return "varchar";
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 2021-11-09
    • 2022-10-13
    • 2014-01-30
    • 1970-01-01
    • 2011-05-22
    • 2011-08-28
    • 2019-05-07
    相关资源
    最近更新 更多