【问题标题】:Convert OrderBy list of String raw query to jpa query将字符串原始查询的 OrderBy 列表转换为 jpa 查询
【发布时间】:2021-09-08 19:23:50
【问题描述】:

表:

ID  Code
1   Health
2   Freeze
3   Phone
4   Phone
5   Health
6   Hot

按字符串原始查询列表排序:

select * from table 
order by FIELD(Code, 'Health', 'Phone', 'Freeze', 'Hot')

我想将此原始查询转换为 JPA 查询,但找不到任何方法。请帮帮我!

注意:我使用的环境

  • MySQL 版本:8.0.25
  • Spring Boot 2.5 版
  • Java 11

更新 1:条件 FIELD(Code, 'Health', 'Phone', 'Freeze', 'Hot') 应该是一个列表。将此原始查询转换为 JPA 查询时,我还想传递一个列表

更新 2:感谢@TimBiegeleisen 的回答和评论,我意识到 JPA 不适合我的问题。

【问题讨论】:

  • 您无法将 Java 字符串列表转换为您在 JPA 查询中需要的 CASE 表达式。 JPA 查询由准备好的语句支持,查询的结构(但不是文字值)必须是硬编码和固定的。
  • @TimBiegeleisen 感谢您的评论。请将此添加到答案中,以便我接受它作为最有帮助的答案!

标签: mysql spring-boot jpa spring-data-jpa java-11


【解决方案1】:

您拥有的 FIELD 表达式,特别是 MySQL,可以使用 CASE 表达式在 ANSI SQL 中重写:

ORDER BY CASE WHEN Code = 'Health' THEN 1
              WHEN Code = 'Phone'  THEN 2
              WHEN Code = 'Freeze' THEN 3
              WHEN Code = 'Hot'    THEN 4 END

我们可以使用以下 JPA 查询:

SELECT e, (CASE WHEN e.Code = 'Health' THEN 1
                WHEN e.Code = 'Phone'  THEN 2
                WHEN e.Code = 'Freeze' THEN 3
                WHEN e.Code = 'Hot'    THEN 4 END) AS ord
FROM Entity e
ORDER BY ord

正如我在上面的 cmets 中提到的,您需要在此处使用固定的 CASE 表达式。您无法将 Java 字符串列表转换为 JPA 查询中需要的 CASE 表达式。 JPA 查询由准备好的语句支持,查询的结构(但不是文字值)必须是硬编码和固定的。

【讨论】:

  • 感谢您的回答!抱歉,我的问题缺少一些信息:条件“健康”,....应该是一个列表,而不是像这样修复条件。我将编辑问题!
猜你喜欢
  • 2018-09-12
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 2015-06-26
  • 1970-01-01
  • 2018-03-13
  • 2017-01-05
相关资源
最近更新 更多