Hibernate один-ко-многим ассоциация получает последнюю запись с использованием критериев - PullRequest
0 голосов
/ 07 января 2020

У меня есть отношение, похожее на

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"))

Как мне получить выше реализацию?

...