在 Hibernate @OrderBy 注释中的情况

mku*_*urz 3 java hibernate jpa jpa-2.0

是否可以CASE WHEN ... END在 Hibernate @OrderBy 注释中使用甚至本机 SQL?如何?

例如(Child对象有一个type属性):

@OneToMany
@OrderBy("CASE WHEN type='GIRL' THEN 1 WHEN type='BOY' THEN 2 ELSE 3 END ASC")
private List<Child> children;
Run Code Online (Sandbox Code Playgroud)

Kev*_*sox 5

该@OrderBy注解实际上是一个 JPA 注解,它接受实体上以逗号分隔的字段名称列表以进行排序。该顺序仅在对数据库的初始查询时执行,并且如果列表被修改则不会被维护。简而言之,您不能为@OrderBy注释提供纯 SQL 。

一种变通方法是创建一个带有包含 case 语句结果的附加列的视图。例如:

create or replace view V_CHILD as
   select
   NAME VARCHAR2,
   TYPE VARCHAR2,
   CASE WHEN type='GIRL' THEN 1 WHEN type='BOY' THEN 2 ELSE 3 END as TYPE_ORDER
   from CHILD;
Run Code Online (Sandbox Code Playgroud)

然后像映射表一样将实体映射到视图。该实体将包含一个typeOrder可以在@OrderBy注释中指定的字段。请注意,您无法插入或更新实体,因为它基于视图。