如何通过 Querydsl 将 String[] 作为 varchar[] 传递给 PostgreSQL?
How to pass String[] as varchar[] through Querydsl to PostgreSQL?
试图更干净地解决 ,我已经走到这一步了。
// 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) does not exist
我怎样才能(如果可能的话)
- 获取
String[]
值以绑定为 varchar[]
?
- 在
booleanTemplate
? 中表达必要的投射
不是直接传递 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";
}
}
}
试图更干净地解决
// 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) does not exist
我怎样才能(如果可能的话)
- 获取
String[]
值以绑定为varchar[]
? - 在
booleanTemplate
? 中表达必要的投射
不是直接传递 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";
}
}
}