在 @OneToMany 映射集合的 @OrderBy 中指定 NULLS LAST

Specify NULLS LAST in @OrderBy of @OneToMany mapped Collection

我有一个这样的映射实体:

@OneToMany(targetEntity = Child.class)
@JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID")
@OrderBy("orderNumber")
private List<Child> children;

我想在映射集合的 @OrderBy 注释中指定 NULLS LAST

我正在使用 Oracle 数据库,它认为 NULL 值大于任何非 NULL 值。 问题出在我的集成测试中,它使用 h2 数据库,似乎对 NULL 值的评估不同。

到目前为止,我想出了一个在 @OrderNumber 中使用 nvl2() 函数的技巧,如下所示:

@OrderBy("nvl2(orderNumber, orderNumber, 100000000)")

这个 hack 有效,但它看起来很讨厌,我不喜欢我因为集成测试而有这个代码的想法。正如我上面提到的,Oracle returns 默认情况下行的顺序是正确的,因此不处理空值的基本 @OrderBy(orderNumber) 效果很好。另一方面,我想测试它以防应用程序使用不同的数据库。

有什么办法可以更好地解决这个问题吗?

要在 H2 中启用 Oracle 兼容模式,您需要按照文档中的建议将 ;MODE=Oracle;DEFAULT_NULL_ORDERING=HIGH 附加到 JDBC URL: https://h2database.com/html/features.html#compatibility

DEFAULT_NULL_ORDERING 设置更改了 NULL 值的默认顺序(当既不使用 NULLS FIRST 也不使用 NULLS LAST 时)。有四个可能的选项,LOW 是默认值。

如果您不需要此设置,可以在没有此兼容模式的情况下单独使用它。