Как с помощью Spring Data Specification сравнить разделение двух столбцов с некоторым входным значением? - PullRequest
0 голосов
/ 10 июля 2020

У меня проблемы с написанием Спецификации данных 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 об этом и как правильно это сделать.

1 Ответ

0 голосов
/ 13 июля 2020

Найден хороший обходной путь, вместо деления вы можете просто перемножить обе части уравнения, так что вам не придется иметь дело с классом Number

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