是否可以在Hibernate @OrderBy注释中使用CASE WHEN ... END
甚至本机SQL?怎么样?
E.g。 (Child
对象具有type
属性):
@OneToMany
@OrderBy("CASE WHEN type='GIRL' THEN 1 WHEN type='BOY' THEN 2 ELSE 3 END ASC")
private List<Child> children;
答案 0 :(得分:3)
@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;
然后将实体完全映射到视图,就像对表一样。该实体将包含typeOrder
字段,可在@OrderBy
注释中指定。请注意,您无法插入或更新实体,因为它基于视图。
答案 1 :(得分:1)
org.hibernate.annotations.OrderBy
采用本机sql,而不像javax.persistence.OrderBy
那样采用hibernate文档中提到的JPQL。
使用SQL排序(不是HQL排序)对集合进行排序。 与{@link javax.persistence.OrderBy}不同的是,这需要SQL片段,而JPA OrderBy则需要有效的JPQL排序片段。