使用 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。事实上,它的某种连接现在并不重要。
列 decimal
和 multiplier
是我的 A 列和 B 列(我也不需要它们中的任何一个为空,否则我无法划分)。这看起来应该可行,但我遇到了一个问题,因为要比较的类型必须实现 Comparable
和 CriteriaBuilder#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
)
我在编写 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。事实上,它的某种连接现在并不重要。
列 decimal
和 multiplier
是我的 A 列和 B 列(我也不需要它们中的任何一个为空,否则我无法划分)。这看起来应该可行,但我遇到了一个问题,因为要比较的类型必须实现 Comparable
和 CriteriaBuilder#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
)