Существует два варианта:
Параметр 1
Вы можете добавить отображение формулы в свой класс домена, а затем запросить его напрямую.
OrderItem {
BigDecimal soldPrice
Integer soldQuantity
BigDecimal totalPrice
static mapping = {
totalPrice formula: "sold_price * sold_quantity"
}
static belongsTo = [order: Order, item: Item]
}
Теперь ваш запрос критерия может содержать только
projections {
sum("totalPrice")
}
Мало того, вы можете запросить его с помощью динамического поиска OrderItem.findAllByTotalPriceGreaterThan(20.00)
, а также с простым доступом println "The final price is ${orderInstance.totalPrice}
.Мы находим это действительно изящным, однако бывают случаи, когда вы хотите получить totalPrice до того, как OrderItem будет сохранен, поэтому мы обычно пишем простой (не сухой) метод получения
BigDecimal getTotalPrice() {
totalPrice ?: (soldPrice && soldQuantity) ? soldPrice * soldQuantity : null
}
Но вам нужны только такие вещиесли вам требуется totalPrice до его сохранения.
Вариант 2
Перед отображениями формул мы обычно выпадали в Hibernate Criteria API и использовали проекцию sqlProjection как частьнашего критерия запроса.
projections {
addProjectionToList(Projections.sqlProjection(
"sum(sold_price * sold_quantity) as totalPrice",
["totalPrice"] as String[],
[Hibernate.LONG] as Type[],
), "sumProjection")
}
Примечание
Я думаю, что важно отметить, что как в формуле, так и в проекции sql используйте имена столбцов вбаза данных и синтаксис вашей конкретной базы данных.