Criteria API子子实体id的路径

问题描述 投票:10回答:2

我想将我的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父ID的父级?

jpa-2.0 criteria-api
2个回答
7
投票

如果您显示的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
投票
SELECT e FROM Entity e inner join e.parent p WHERE p.id = :parentId

在标准中称它为别名,如:

sess.createCriteria(Entity.class)
    .createAlias("e.parent", "p")
© www.soinside.com 2019 - 2024. All rights reserved.