Критерий API Путь к идентификатору субсубъекта - PullRequest
10 голосов
/ 30 ноября 2011

Я хочу преобразовать свои запросы 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 для родительского идентификатора родителя?

Ответы [ 2 ]

7 голосов
/ 03 декабря 2011

Если 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();
1 голос
/ 21 августа 2013
SELECT e FROM Entity e inner join e.parent p WHERE p.id = :parentId

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

sess.createCriteria(Entity.class)
    .createAlias("e.parent", "p")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...