Мы хотели бы создать эквивалент этого SQL-запроса:
Код: Выделить всё
select iv.customer_id, iv. latest_order_date,
case when exists (
select 1
from shipments sh
where sh.customer_id = iv.customer_id
and sh.ship_date = sh.latest_order_date
) then 1 else 0 end same_day
from (
select od.customer_id, max(od.order_date) latest_order_date
from orders od
group by od.customer_id
where od.area_id = 317 and od.status = 'new'
) iv
Код: Выделить всё
select od.customer_id ... status = 'new'
Причина, по которой мы хотели бы использовать API критериев и почему фиксированное представление или @Subselect не будет работать, заключается в том, что < em>where условие во встроенном представлении очень динамично и сложно, и его можно повторно использовать из других мест. Приведенный выше пример упрощен.
Главное, чего мы не можем понять, — это как использовать встроенное представление в качестве объекта для выбора для основного запроса, обозначенного ??? ниже:
Код: Выделить всё
var inlineView = criteriaBuilder.createTupleQuery();
var orderRoot = inlineView.from(OrderEntity.class);
orderRoot.groupBy(...);
orderRoot.multiselect(...);
orderRoot.where(...);
var mainQuery = criteriaBuilder.createTupleQuery();
var root = query.from( ??? );
var countQuery = mainQuery.subquery(Long.class);
var shipmentRoot = countQuery.from(ShipmentEntity.class);
shipmentRoot.where(...);
root.multiselect(...);
Код: Выделить всё
latest_order_date
Подробнее здесь: https://stackoverflow.com/questions/790 ... rom-clause