【发布时间】:2022-01-20 09:07:36
【问题描述】:
这是我关于stackoverflow的第一个问题,如果有任何不准确的地方,请提前道歉
在我的项目中,我使用 Hibernate(作为 ORM 框架)和 QueryDSL 库,PostgreSQL 作为数据库。
基本上,我需要检查列表“arr”的大小,这是某个“X”类的属性,所以我用谷歌搜索并找到了一种使用带有 querydsl 的 postgres 函数的方法,如下所示(在你问之前,我按要求不能使用本机查询):
BooleanBuilder builder = new BooleanBuilder();
builder.and(Expressions.booleanTemplate("function('array_length', {0})", qX.arr)
.castToNum(Integer.class).gt(0));
一切编译正常,但是当调用存储库方法时,我得到一个错误:
错误:“.”处或附近的语法错误职位:...
我检查了所有内容,但没有“。”在那个位置和附近的位置也是如此。
但是设置spring.jpa.show-sql=true后发现确实有一个“.”符号在该位置的某处,结果 SQL 语句如下所示:
... and cast(array_length(.) as int4)>?
这意味着,JPA 不能将我的 'arr' 放入 array_length() 函数中(是这样吗?)
为什么会这样?难道我做错了什么? 提前谢谢你
我的实体类是这样的:
@EqualsAndHashCode(callSuper = true)
@Entity
@Table
@Data
@NoArgsConstructor
@TypeDefs({
@TypeDef(name = "list-array", typeClass = ListArrayType.class)
})
public class X extends BaseClass {
// private fields
@Type(type = "list-array")
@Column(name = "arr", columnDefinition = "bigint[]")
@ElementCollection
@OrderColumn
private List<Long> arr;
}
我尝试不使用 @ElementCollection 和 @OrderColumn 注释,但这给了我投射错误
【问题讨论】:
-
你能添加你的实体类来展示数组类型是如何指定的吗?
-
@fladdimir 是的,当然。我已经更新了我的问题
-
这里好像有2个问题,希望答案有帮助?
-
不确定您使用的是哪个 ListArrayType 实现,但我已经为 Hibernate-Types 实现了 Querydsl 绑定,它也有
array_length支持:github.com/jwgmeligmeyling/hibernate-types-querydsl-apt -
@Jan-WillemGmeligMeyling 我用的是com.vladmihalcea.hibernate.type.array.ListArrayType,不过我会看看你的建议,谢谢!
标签: postgresql hibernate jpa jpql querydsl