Spring Data with Postgres 问题:如何将时区参数传递到本机查询中?

问题描述 投票:0回答:1

我有一个本机查询:

@Query( value = "select to_char(o.earliest_delivery_time at time zone 'UTC', 'Mon YYYY') as month, " +
        " count(o.id) as orderQuantity, " +
        " sum(lp.net_qty) as gallonQuantity " +
        " from orders o " +
        " left join lifts l on o.id = l.order_id " +
        " left join liftproducts lp on l.id = lp.lift_id " +
        " where earliest_delivery_time>= :startReportDate " +
        " AND o.status in :statuses" +
        " AND (o.bill_to_id IN  (:userCompany)" +
        "        OR o.carrier_id in  (:userCompany) OR o.retailer_id in  (:userCompany)" +
        "        OR o.wholesaler_id in  (:userCompany) OR o.requestor_id in (:userCompany)) " +
        " group by to_char(o.earliest_delivery_time at time zone 'UTC', 'Mon YYYY')", nativeQuery = true)
List<OrdersByTimeDashboardDto> getOrdersByTime(@Param("startReportDate") Instant startReportDate,
                                               @Param("userCompany") Long userCompany,
                                               @Param("statuses") Collection<String> statuses,
                                              );

它工作正常,但现在我想传递时区作为参数,所以:

@Query( value = "select to_char(o.earliest_delivery_time at time zone :timezone, 'Mon YYYY') as month, " +
            " count(o.id) as orderQuantity, " +
            " sum(lp.net_qty) as gallonQuantity " +
            " from orders o " +
            " left join lifts l on o.id = l.order_id " +
            " left join liftproducts lp on l.id = lp.lift_id " +
            " where earliest_delivery_time>= :startReportDate " +
            " AND o.status in :statuses" +
            " AND (o.bill_to_id IN  (:userCompany)" +
            "        OR o.carrier_id in  (:userCompany) OR o.retailer_id in  (:userCompany)" +
            "        OR o.wholesaler_id in  (:userCompany) OR o.requestor_id in (:userCompany)) " +
            " group by to_char(o.earliest_delivery_time at time zone :timezone, 'Mon YYYY')", nativeQuery = true)
    List<OrdersByTimeDashboardDto> getOrdersByTime(@Param("startReportDate") Instant startReportDate,
                                                   @Param("userCompany") Long userCompany,
                                                   @Param("statuses") Collection<String> statuses,
                                                   @Param("timezone") String timezone
                                                  );

例如时区可以是:

String timezone = "UTC";
更改后,我收到一个错误:

错误:列“o.earliest_delivery_time”必须出现在 GROUP BY 子句中或在聚合函数中使用

我尝试了很多解决方案,但没有一个对我有用。

java postgresql hibernate jpa spring-data-jpa
1个回答
0
投票

我遇到了类似的问题,以下更改应该有帮助

尝试使用

group by month

而不是

group by to_char(o.earliest_delivery_time at time zone :timezone, 'Mon YYYY')

附注迟到的答案=),但也许这对某人有用

© www.soinside.com 2019 - 2024. All rights reserved.