java - 如何使用JPA在spring-boot中通过排序聚合列来进行SQL查询?

标签 java mysql spring jpa

我在针对 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

以下解决方案更好:

  • 具有尽可能多的命名查询排序顺序
  • 将排序字符串连接到查询字符串
  • 使用条件查询

Hibernate Named Query Order By parameter

关于java - 如何使用JPA在spring-boot中通过排序聚合列来进行SQL查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33478276/

相关文章:

java - 设计一个基于插件的 java 应用程序

java - 不消耗窗口按钮JavaFx的Keybord事件

java - Android:媒体播放器流在几分钟后停止播放

python - Windows 上的 mysql 连接器/mysqlclient 和 django 问题

mySQL 从 VB 中的列和文本框插入

java - Spring URL映射问题

java - Spring data JPA findFirst 带有where子句(过滤)和order by,抛出内部异常

java - Future get(),如果未完成,是否会阻塞调用?

java - 鼠标位置更新不正确

mysql - 为什么 PREPARE 语句中不能使用 in 参数