我在针对 MySQL 表编写 JPA 查询时遇到问题。
表结构如下所示:
mysql> desc t_product_purchase;
+-----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| oid | bigint(20) | NO | PRI | NULL | |
| consumer_id | bigint(20) | NO | | NULL | |
| number | bigint(20) | YES | | NULL | |
| pay_time | datetime | YES | | NULL | |
| payment | float | YES | | NULL | |
| price | float | YES | | NULL | |
| product_num_iid | bigint(20) | NO | | NULL | |
| seller_id | bigint(20) | NO | MUL | NULL | |
| product_title | varchar(255) | YES | | NULL | |
+-----------------+--------------+------+-----+---------+-------+
9 rows in set (0.00 sec)
以下 SQL 按预期执行。
select m.product_num_iid, sum(m.payment) as payment, sum(m.number) as nbr from t_product_purchase m where m.seller_id = 247475251 and m.pay_time >= 0 group by m.product_num_iid order by payment desc limit 0, 10
付款可以正确订购。
在我的 spring-boot JPA 存储库界面中: @事务性 @存储库 公共(public)接口(interface) ProductPurchaseMeasurementRepository 扩展 JpaRepository {
@Query(value = "select m.product_num_iid, sum(m.payment) as payment, sum(m.number) as nbr from t_product_purchase m where m.seller_id = ?1 and m.pay_time >= ?2 and m.pay_time < ?3 group by m.product_num_iid order by ?4 desc limit ?5, ?6", nativeQuery = true)
public List findRankedProductPaymentOrCountBySellerIdWithinPayTime(long sellerId, Date startPayTime, Date endPayTime, String orderBy, long offset, long size);
}
参数 orderBy 将传递值“payment ”。但我无法在方法的返回值中获取有序记录。
有人知道为什么存储库方法没有按预期工作吗?谢谢。
最佳答案
不支持,仅允许在 WHERE 和 HAVING block 中使用输入参数,并且不能使用 ORDER BY 子句的参数。
解决方案
order by
case when 'a' = :a then ec.ISACTIVE else 1 end asc,
case when 'a' != :a then ec.ISACTIVE else 1 end desc
以下解决方案更好:
- 具有尽可能多的命名查询排序顺序
- 将排序字符串连接到查询字符串
- 使用条件查询
关于java - 如何使用JPA在spring-boot中通过排序聚合列来进行SQL查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33478276/