У меня проблемы с написанием Спецификации данных Spring, которая должна отфильтровывать некоторые строки из поискового запроса БД.
Предположим, в базе данных есть таблица. Эта таблица содержит два столбца, каждый из которых имеет тип 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
- моя таблица. Тот факт, что это какое-то соединение, сейчас не важен.
Столбцы decimal
и multiplier
- мои столбцы A и B (мне также не нужно, чтобы ни один из них был нулевым, иначе я не могу разделить). Похоже, это должно сработать, но я столкнулся с проблемой, потому что сравниваемые типы должны реализовывать методы Comparable
и CriteriaBuilder#quot()
, возвращаемый тип - Expression<Number>
. Класс Number
не сопоставим. Похоже, нужны приведения классов? Но я не знаю, как go об этом и как правильно это сделать.