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

PostgreSQL springboot spring data jpa 集成

Spring JPA 无法连接到 Postgresql