最近将我的项目升级到Spring boot 3和Hibernate 6.1.5(从5.x)。我正在努力迁移我们曾经扩展过的不同方言。
覆盖方言的方式已经改变,所以我从这个(hibernate 5)迁移了我的H2方言扩展:
public class ExtendedH2Dialect extends H2Dialect {
@Override
public String renderOrderByElement(String expression, String collation, String order, NullPrecedence nulls) {
return super.renderOrderByElement(expression, collation, order, NullPrecedence.LAST);
}
}
To this (hibernate 6):
public class ExtendedH2Dialect extends H2Dialect {
public ExtendedH2Dialect(DialectResolutionInfo info) {
super(info);
}
@Override
public NullOrdering getNullOrdering() {
return NullOrdering.LAST;
}
}
但是空排序似乎被JPA查询完全忽略了。例如,如果我在hibernate 5中这样做:
entityManager.createQuery("from CityEntity order by name").getResultList();
生成的查询是:
选择cityentity0_。Id为id1_0_, cityentity0_.name为name2_0_从city_entity cityentity0_ order by cityentity0_.name null last
现在是hibernate 6,它是:
select c1_0.id,c1_0.name from city_entity order by c1_0.name
我的自定义方言仍在注册"HHH000400:使用方言:com.example.demoextendh2.ExtendedH2Dialect"
我在这里上传了一个最小的可复制项目
我做错什么了吗?找不到很多关于自定义方言迁移的文档。
看起来默认的排序属性需要在项目的配置(应用程序)中设置。Yml之类的):
hibernate.order_by.default_null_ordering:"去年">
并且在您的方言中只需要在supportsNullPrecedence()调用时返回true,但这应该已经是情况。(不要重写getNullOrdering()方法)。
这解决了我们的问题。似乎当决定是否需要为null添加排序时,AbstractSqlAstTranslator比较配置中所需的默认排序和方言提供的排序。它只会在它们不同且方言支持空排序时添加显式空排序。意思是,如果Dialect已经以最后为空排序,并且您要求最后为空,hibernate知道它不需要添加显式排序,因为它应该自动获得它(根据方言)