gpt4 book ai didi

Hibernate 6 H2 方言覆盖 Nulls 优先级被忽略

转载 作者:行者123 更新时间:2023-12-05 05:29:51 25 4
gpt4 key购买 nike

最近将我的项目升级到 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);
}
}

对此( 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();

生成的查询是:

select cityentity0_.id as id1_0_, cityentity0_.name as name2_0_ from city_entity cityentity0_ order by cityentity0_.name nulls last

现在使用 hibernate 6 是:

select c1_0.id,c1_0.name from city_entity c1_0 order by c1_0.name

我的自定义方言仍然注册为“HHH000400:使用方言:com.example.demoextendh2.ExtendedH2Dialect”。

我上传了一个最小的可复制项目 here

我做错了什么吗?找不到很多关于自定义方言迁移的文档。

最佳答案

看起来需要在项目的配置(application.yml,或者你有什么)中设置默认排序属性:

hibernate.order_by.default_null_ordering: 'last'

在您的方言中,只需要在调用 supportsNullPrecedence() 时返回 true,但这应该已经是这种情况了。 (不要覆盖 getNullOrdering() 方法)。

这解决了我们的问题。似乎在决定是否需要为空值添加排序时,AbstractSqlAstTranslator 将配置中所需的默认排序与方言提供的排序进行比较。如果它们不同并且方言支持空排序,它只会添加一个显式的空排序。意思是,如果方言最后已经用空值排序,而你最后需要空值,hibernate 知道它不需要添加显式排序,因为它应该自动获取它(根据方言)

关于Hibernate 6 H2 方言覆盖 Nulls 优先级被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74826113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com