是否可以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;
@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
注释中指定的字段。请注意,您不能插入或更新实体,因为它基于视图。
org.hibernate.annotations.OrderBy
采用本机 sql 不像javax.persistence.OrderBy
采用休眠文档中提到的 JPQL。
使用 SQL 排序(不是 HQL 排序)对集合进行排序。与 {@link javax.persistence.OrderBy} 不同之处在于它需要 SQL 片段,JPA OrderBy 需要一个有效的 JPQL 排序片段。