在Hibernate @OrderBy注释中的情况

时间:2013-10-10 16:07:12

标签: java hibernate jpa jpa-2.0

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

2 个答案:

答案 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排序片段。