将 String 原始查询的 OrderBy 列表转换为 jpa 查询
Convert OrderBy list of String raw query to jpa query
Table:
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 引导版本 2.5
- Java 11
更新 1:条件 FIELD(Code, 'Health', 'Phone', 'Freeze', 'Hot') 应该是一个列表。我还想在将此原始查询转换为 JPA 查询时传递一个列表
更新 2:感谢@TimBiegeleisen 的回答和评论,我意识到 JPA 不适合我的问题。
您拥有的 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
正如我在上面的评论中提到的,您将需要一个固定的 CASE
表达式。您不能将 Java 字符串列表转换为 JPA 查询中需要的 CASE 表达式。 JPA 查询由准备好的语句支持,查询的结构(但不是文字值)必须进行硬编码和修复。
Table:
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 引导版本 2.5
- Java 11
更新 1:条件 FIELD(Code, 'Health', 'Phone', 'Freeze', 'Hot') 应该是一个列表。我还想在将此原始查询转换为 JPA 查询时传递一个列表
更新 2:感谢@TimBiegeleisen 的回答和评论,我意识到 JPA 不适合我的问题。
您拥有的 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
正如我在上面的评论中提到的,您将需要一个固定的 CASE
表达式。您不能将 Java 字符串列表转换为 JPA 查询中需要的 CASE 表达式。 JPA 查询由准备好的语句支持,查询的结构(但不是文字值)必须进行硬编码和修复。