Однострочное, встроенное решение для этого (поддерживает v2 / v3, итераторы, использует стандартную библиотеку и понимание одного генератора):
import itertools
def split_groups(iter_in, group_size):
return ((x for _, x in item) for _, item in itertools.groupby(enumerate(iter_in), key=lambda x: x[0] // group_size))
Я думаю, вы также можете использовать проекцию SQL. Это должно быть примерно так:
session.createCriteria(Item.class)
.createAlias("item", "i")
.setProjection( Projections.projectionList()
.add( Projections.groupProperty("i.id") )
.add( Projections.groupProperty("i.price") )
.add( Projections.groupProperty("i.quantity") )
.add( Projections.sqlProjection(
"price * quantity as total",
new String[] { "total" },
new Type[] { Hibernate.DOUBLE }
)
)
);
Ори
Это не совсем то, что вы просили, но вы можете использовать «производные свойства» для получения чего-то похожего.
Например, вы можете сопоставить свойство totalPrice с выражением SQL:
<property name="totalPrice" formula="quantity * price" type="big_decimal"/>
Формула SQL «количество * цена» вычисляется каждый раз, когда объект извлекается из базы данных.
Ori
Hibernate docs содержат дополнительную информацию об этом.
Это (вероятно) невозможно сделать с помощью критериев. Но HQL может быть здесь полезен.
SELECT ent.quantity*ent.price from EntityName as ent WHERE ent.id = ?