使用 Spring 数据规范,您如何将两列的划分与某些输入值进行比较?

Using Spring Data Specifications, how do you compare a division of two columns with some input value?

我在编写 Spring 数据规范时遇到问题,它应该从数据库搜索查询中过滤掉一些行。

假设数据库中有一个table。这个 table 包含两列,它们都是 int 类型。我需要一个 Spring 数据规范,它可以按这两列的划分进行过滤。因此,如果这些列是 A 和 B,则需要将 A/B 与某个已知输入值进行比较。

这是我正在尝试做的事情(我正在使用 Kotlin)

return Specification { root: Root<Payment>, _: CriteriaQuery<*>?, builder: CriteriaBuilder ->
        val settlement: Join<Payment, Settlement> = root.join("settlement", JoinType.INNER)

        val decimalExpression = settlement.get<Long>("decimal")
        val multiplierExpression = settlement.get<Long>("multiplier")
        val divisionExpression : Expression<Number> = builder.quot(decimalExpression, multiplierExpression)
        builder.and(
                builder.isNotNull(decimalExpression),
                builder.isNotNull(multiplierExpression),
                builder.greaterThanOrEqualTo(
                        divisionExpression,
                        someKnownLongValue
                ))
    }

所以 settlement 是我的 table。事实上,它的某种连接现在并不重要。

decimalmultiplier 是我的 A 列和 B 列(我也不需要它们中的任何一个为空,否则我无法划分)。这看起来应该可行,但我遇到了一个问题,因为要比较的类型必须实现 ComparableCriteriaBuilder#quot() 方法 return 类型是 Expression<Number>。 class Number 没有可比性。看起来需要一些 class 转换?但我不确定该怎么做以及正确的做法是什么。

找到了一个很好的解决方法,不用除法,你可以将等式的两个部分相乘,这样你就不必处理'Number' class

val multipliedExpression = builder.prod(settlement.get<Long>("multiplier"), someKnownLongValue)
builder.greaterThanOrEqualTo(
    settlement.get<Long>("decimal"),
    multipliedExpression
)