У меня есть отношение, похожее на
Person (1) ----> Order (N)
По существу, отношение один-ко-многим между таблицами Person и Order.
Я хочу определить QueryCriteria так, чтобы при загрузке сущности Person Я загружаю только один ордер или самый последний ордер.
Как мне это сделать?
Я пытался
CriteriaBuilder cb = _entityManagerProvider.get().getCriteriaBuilder();
CriteriaQuery<PersonEntity> cq = cb.createQuery(PersonEntity.class);
Root<PersonEntity> root = cq.from(PersonEntity.class);
ListJoin<PersonEntity, OrderEntity> listJoin = root.joinList("orderEntityList");
Subquery<Long> sq = cq.subquery(Long.class);
Root<OrderEntity> orderRoot = sq.from(OrderEntity.class);
sq.select(cb.max(orderRoot.get("id")));
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(listJoin.get("id"), sq));
predicates.add(cb.equal(root.get("personId"), personId));
cq.select(root).where(predicates.toArray(new Predicate[]{}));
final List<PersonEntity> entityList = _entityManagerProvider.get().createQuery(cq).getResultList();
Я получаю entityList как пустой. Однако в бэкэнде у меня есть две записи заказа для данного человека, и я надеялся получить недавнюю запись заказа.
---- Редактировать ----
Так что я решил, что проблема вокруг sq.select (cb.max (order Root .get ("id")));
Возвращает max Id из таблицы заказов по очевидной причине. Что мне нужно, это идентификатор для заказа с максимальной датой создания, что-то вроде
sq.select(orderRoot.get("id")).where(cb.max(orderRoot.get("createDate"))
Как мне получить выше реализацию?