在 @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
是默认值。
如果您不需要此设置,可以在没有此兼容模式的情况下单独使用它。
我有一个这样的映射实体:
@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
是默认值。
如果您不需要此设置,可以在没有此兼容模式的情况下单独使用它。