Hibernate order by 空值最后

新手上路,请多包涵

与 PostgreSQL DB 一起使用的 Hibernate 在按列排序 desc 时将空值置于高于非空值的位置。

SQL99 标准提供关键字“NULLS LAST”来声明空值应该低于非空值。

使用 Hibernate 的 Criteria API 可以实现“NULLS LAST”行为吗?

原文由 mgamer 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

鉴于 HHH-465 尚未修复并且由于 Steve Ebersole 给出的原因在不久的将来也不会得到修复,您最好的选择是使用 CustomNullsFirstInterceptor 全局或特定地附加到该问题改变 SQL 语句。

我将其发布在下面供读者使用(感谢 Emilio Dolce):

 public class CustomNullsFirstInterceptor extends EmptyInterceptor {

    private static final long serialVersionUID = -3156853534261313031L;

    private static final String ORDER_BY_TOKEN = "order by";

    public String onPrepareStatement(String sql) {

        int orderByStart = sql.toLowerCase().indexOf(ORDER_BY_TOKEN);
        if (orderByStart == -1) {
            return super.onPrepareStatement(sql);
        }
        orderByStart += ORDER_BY_TOKEN.length() + 1;
        int orderByEnd = sql.indexOf(")", orderByStart);
        if (orderByEnd == -1) {
            orderByEnd = sql.indexOf(" UNION ", orderByStart);
            if (orderByEnd == -1) {
                orderByEnd = sql.length();
            }
        }
        String orderByContent = sql.substring(orderByStart, orderByEnd);
        String[] orderByNames = orderByContent.split("\\,");
        for (int i=0; i<orderByNames.length; i++) {
            if (orderByNames[i].trim().length() > 0) {
                if (orderByNames[i].trim().toLowerCase().endsWith("desc")) {
                    orderByNames[i] += " NULLS LAST";
                } else {
                    orderByNames[i] += " NULLS FIRST";
                }
            }
        }
        orderByContent = StringUtils.join(orderByNames, ",");
        sql = sql.substring(0, orderByStart) + orderByContent + sql.substring(orderByEnd);
        return super.onPrepareStatement(sql);
    }

}

原文由 Pascal Thivent 发布,翻译遵循 CC BY-SA 3.0 许可协议

如前所述,此功能已在 Hibernate 4.2.x 和 4.3.x 版本中实现。

它可以用作例如:

 Criteria criteria = ...;
criteria.addOrder( Order.desc( "name" ).nulls(NullPrecedence.FIRST) );

Hibernate v4.3 javadocs 在 这里 没有那么遗漏。

原文由 José Andias 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题