3

是否可以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;
4

2 回答 2

5

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

一种解决方法是创建一个视图,其中包含一个包含案例语句结果的附加列。例如:

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;

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

于 2013-10-10T16:12:50.367 回答
2

org.hibernate.annotations.OrderBy采用本机 sql 不像javax.persistence.OrderBy采用休眠文档中提到的 JPQL。

使用 SQL 排序(不是 HQL 排序)对集合进行排序。与 {@link javax.persistence.OrderBy} 不同之处在于它需要 SQL 片段,JPA OrderBy 需要一个有效的 JPQL 排序片段。

于 2020-08-30T12:07:20.320 回答