Я пытаюсь создать запрос, используя CriteriaBuilder
, чтобы выбрать все Product
с запасом, большим нуля. Фондовый - sum(DeliveryRow.amount) - sum(DispatchRow.amount)
. Оба они имеют только право Product
.CriteriaBuilder join/subquery с результирующим Integer
Я попытался создать Subquery
как для DeliveryRow
и DispatchRow
, хотя я чувствую, что это должно быть сделано с помощью join()
.
Классы
Product {
(...)
}
DeliveryRow {
@ManyToOne
private Product product;
private int amount;
}
DispatchRow {
@ManyToOne
private Product product;
private int amount;
}
Запрос
В этом запросе я не знаю, как справиться с xxx
. Я пробовал делать подзапросы, но это не сработало.
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Product> query = cb.createQuery(Product.class);
Root product = query.from(Product.class);
query.select(product);
// sum of DeliveryRow.amount where DeliveryRow.product = Product
// minus
// sum of DispatchRow.amount where DispatchRow.product = Product
Expression stock = xxx;
query.where(cb.gt(stock, Integer.parseInt(0)));
return em.createQuery(query).getResultList();
Любые предложения по тому, как это решить?
Я работал с NamedQueries раньше, хотя я использую CriteriaBuilder из-за типов безопасности, разве вы не беспокоитесь об этом? – Aquillo
В чем вас беспокоит безопасность типов, объект []? –
Отсутствует запрос 'String'. Любые изменения в say 'DispatchRow' могут вызвать проблемы? – Aquillo