首页 > 解决方案 > Spring JPA 中的 PostgreSQL 数组运算符

问题描述

我正在尝试使用数组运算符,例如@>,<@$$. 但是我得到了@ 我的要求的象征性字符:

@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]

提前致谢

标签: javaspring-bootspring-data-jpajpql

解决方案


这些仅适用于本机查询。HQL 没有 Postgres 的数组运算符的概念,也没有提供自己的类似运算符,因为并非所有数据库都支持它们。因此,native = true改为使用纯 SQL 重写查询。


推荐阅读