Spring JPA 中的 PostgreSQL 数组运算符
Posted
技术标签:
【中文标题】Spring JPA 中的 PostgreSQL 数组运算符【英文标题】:PostgreSQL array operatiors in spring JPA 【发布时间】:2020-04-03 18:03:06 【问题描述】:我正在尝试使用数组运算符,例如 @>
、<@
或 $$
。但是我得到了符号字符@
这是我的要求:
@Transactional
@Modifying
@Query(
"update EbOrder o set o.xEbEtablissement= :newEtablissement " +
"where o.xEbEtablissement = (select distinct u.xEbEtablissement" +
"from EbOrder o, EbUser u" +
"where regexp_split_to_array(:listLabels, ',') @> (regexp_split_to_array(o.listLabels,','))" +
"and u.ebUserNum= :userNum and o.xEbEtablissement = :oldEtablissement)"
)
public int updateOrderEtablissementAndLabels(
@Param("userNum") Integer userNum,
@Param("oldEtablissement") EbEtablissement oldEtablissement,
@Param("newEtablissement") EbEtablissement newEtablissement,
@Param("listLabels") String listLabels
);
错误是:
Caused by: org.hibernate.QueryException: unexpected char: '@' [update com.adias.mytowereasy.delivery.model.EbOrder o set o.xEbEtablissement= :newEtablissement where o.xEbEtablissement = (select distinct u.xEbEtablissementfrom EbOrder o, com.adias.mytowereasy.model.EbUser uwhere regexp_split_to_array(:listLabels, ',') @> (regexp_split_to_array(o.listLabels,','))and u.ebUserNum= :userNum and o.xEbEtablissement = :oldEtablissement)]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:235) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:143) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:119) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153) ~[hibernate-core-5.3.7.Final.jar:5.3.7.Final]
提前致谢
【问题讨论】:
【参考方案1】:这些仅适用于本机查询。 HQL 没有 Postgres 的数组运算符的概念,也没有提供自己的类似运算符,因为并非所有数据库都支持它们。所以添加 native = true
并改用纯 SQL 重写查询。
【讨论】:
以上是关于Spring JPA 中的 PostgreSQL 数组运算符的主要内容,如果未能解决你的问题,请参考以下文章
如何使每个表中的主键值应从数字一(1)开始 - PostgreSQL,Spring data jpa
Spring\JPA\PostgreSQL:为啥我得到一个不是我创建的表?
通过 Spring Boot JPA + Postgresql + H2 执行间隔
Spring Boot + Spring Data JPA + PostgreSQL