使用mysql“;“按案例订购”;在hibernate标准中

使用mysql“;“按案例订购”;在hibernate标准中,mysql,hibernate,hibernate-criteria,Mysql,Hibernate,Hibernate Criteria,我使用的是Hibernate 4.3.1 final,Mysql 5.5,我希望在一些连接的实体上使用“按案例排序”的顺序逻辑 我希望实现的纯sql表示形式如下所示: select adv.id, adv.published_date from advert as adv join account as act on act.id = adv.act_id join account_status as aas on aas.id = act.current_aas_id order

我使用的是Hibernate 4.3.1 final,Mysql 5.5,我希望在一些连接的实体上使用“按案例排序”的顺序逻辑

我希望实现的纯sql表示形式如下所示:

select adv.id, adv.published_date 
from advert as adv 
  join account as act on act.id = adv.act_id
  join account_status as aas on aas.id = act.current_aas_id
order by case aas.status
when 'pending' THEN 1
when 'approved' THEN 1
else 2
end, adv.published_date;
该命令将待决和已批准帐户的广告置于非活动帐户的广告之前

我已经使用hibernate标准完成了所有select查询,但我不确定如何使用该api指定ORDERBY case语句

我发现这个帖子:

但我需要按案例顺序引用连接的实体类,我不知道如何做到这一点


非常感谢任何帮助或建议。

我想我找到了解决办法

最后,我创建了自己的Order子类,并将公共字符串重写为QLString(Criteria,CriteriaQuery)方法:

重要的调用(我在order类的原始实现中发现)是

这使我能够使用case语句访问我想要订购的列的别名

如果其他人正在查看此问题,如果您对根对象以外的属性进行排序,请确保在条件联接中使用别名,并且在实例化自定义Order propertyName时,在自定义Order propertyName中正确引用这些别名。

可能值得一提的是,现在您正在像这样添加Order子类

criteria.addOrder(new CustomOrder());
而不是

criteria.addOrder(CustomOrder.desc(fieldName));
因为desc/asc是静态方法,仍然会创建Order实例而不是CustomOrder

criteria.addOrder(new CustomOrder());
criteria.addOrder(CustomOrder.desc(fieldName));