我正在使用 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 标准完成所有选择查询,但我不确定如何使用该 api 指定 order by case 语句。
我找到了这个帖子:
http://blog.tremend.ro/2008/06/10/how-to-order-by-a-custom-sql-formulaexpression-when-using-hibernate-criteria-api/ http://blog.tremend.ro/2008/06/10/how-to-order-by-a-custom-sql-formulaexpression-when-using-hibernate-criteria-api/
但我需要按案例的顺序引用连接的实体类,但我不知道如何做到这一点。
非常感谢任何帮助或建议。
我想我找到了解决方案。
最后,我创建了自己的 Order 子类并覆盖了 public String toSqlString(Criteria,CriteriaQuery) 方法:
@Override
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) {
final String[] columns = criteriaQuery.getColumnsUsingProjection( criteria, getPropertyName() );
final StringBuilder fragment = new StringBuilder();
fragment.append(" case ").append(columns[0]);
fragment.append(" when 'pending' then 1 ");
fragment.append(" when 'approved' then 1 ");
fragment.append(" else 2 end");
return fragment.toString();
}
重要的调用(我在订单类的原始实现中找到)是
criteriaQuery.getColumnsUsingProjection(criteria, getPropertyName());
这使我可以访问我想要使用 case 语句订购的列的别名。
如果其他人正在查看此内容,如果您要对不在根对象上的属性进行排序,请确保在条件连接中使用别名,然后在您的自定义 Order propertyName 中正确引用这些别名。实例化它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)