Критерии API Путь к идентификатору суб-сущности

Я хочу преобразовать свои запросы JPAQL в запросы критериев API.

Рассмотрим такой запрос:

SELECT e FROM Entity e WHERE e.parent.id = :parentId
Часть

WHERE преобразуется в:

Path<Long> parentId = root.get(Entity_.parent).get(ParentEntity_.id);
Predicate whereParentId = builder.equal(parentId, selectedParent.getId());

Вопрос в том, как создать предикат для WHERE следующим образом:

SELECT e FROM Entity e WHERE e.parent.parent.id = :parentId

Как создать Path для родителя родительского идентификатора?

Ответ 1

Если JPQL, который вы показали, работает, то я предположим, что ваш ParentEntity содержит ссылку на своего родителя (в форме поля parent типа ParentEntity). Поэтому что-то вроде этого должно работать:

Path<Long> parentId = root.get(Entity_.parent).get(ParentEntity_.parent)
                          .get(ParentEntity_.id);
Predicate whereParentId = builder.equal(parentId, selectedParent.getId());

Я сделал аналогичную вещь, но для одной сущности (Customer является дочерней и родительской сущностью в одно и то же время и ссылается на ее родительское поле в поле parent типа Customer), и что-то вроде этого отлично справляется:

query.select(customer)
     .where(criteriaBuilder.equal(
                  customer.get("parent").get("parent").get("id"), 
                  criteriaBuilder.parameter(int.class, "parentId")));

List<Customer> customers = em.createQuery(query)
                         .setParameter("parentId", john.getId()).getResultList();

Ответ 2

SELECT e FROM Entity e inner join e.parent p WHERE p.id = :parentId

в критериях называет это псевдоним вроде:

sess.createCriteria(Entity.class)
    .createAlias("e.parent", "p")