mysql - 在 hibernate 条件中使用 mysql "order by case"

标签 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 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/

但我需要按案例顺序引用连接的实体类,但我不确定该怎么做。

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

最佳答案

我想我找到了解决办法。

最后我创建了自己的 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 语句访问我想订购的列的别名。

如果其他人正在查看此内容,如果您对不在根对象上的属性进行排序,请确保您在条件连接中使用别名,然后在您的自定义订单中正确引用这些别名实例化时的 propertyName。

关于mysql - 在 hibernate 条件中使用 mysql "order by case",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24033082/

相关文章:

python - Django 属性错误 : 'str' object has no attribute 'tzinfo'

java - MYSQL连接关闭后不允许操作

java - Spring MVC Hibernate Spring Security 登录

java - Hibernate : object. org.hibernate.MappingException

java - 具有 hibernate 标准的 hibernate 继承(TABLE_PER_CLASS)

java - Hibernate 多个表的连接和限制

php - mysql fetch_array 错误

java - 使用数据源未选择数据库 SQLException

java - JPA。 Stackoverflow 上的级联合并

hibernate - 删除重复记录时分页结果错误