休眠顺序 by,最后为空值
2022-09-01 04:10:52
与 PostgreSQL DB 一起使用的休眠,同时按列对 desc 进行排序时,空值高于非空值。
SQL99 标准提供了关键字“NULLS LAST”来声明 null 值应低于 null。
“NULLS LAST”行为可以使用Hibernate的Cris criteria API来实现吗?
与 PostgreSQL DB 一起使用的休眠,同时按列对 desc 进行排序时,空值高于非空值。
SQL99 标准提供了关键字“NULLS LAST”来声明 null 值应低于 null。
“NULLS LAST”行为可以使用Hibernate的Cris criteria API来实现吗?
如前所述,此功能已在 Hibernate 4.2.x 和 4.3.x 版本中实现。
它可以用作例如:
Criteria criteria = ...;
criteria.addOrder( Order.desc( "name" ).nulls(NullPrecedence.FIRST) );
Hibernate v4.3 javadocs在这里不那么糟糕。
鉴于HHH-465尚未修复,并且由于Steve Ebersole给出的原因,在不久的将来也不会修复,因此您最好的选择是全局或专门使用附加到该问题的方法来更改SQL语句。CustomNullsFirstInterceptor
我在下面为读者发布它(归功于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);
}
}