我想将我的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
如何为父ID的父级创建Path
?
答案 0 :(得分: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 :(得分:1)
SELECT e FROM Entity e inner join e.parent p WHERE p.id = :parentId
标准中的称之为别名,如:
sess.createCriteria(Entity.class)
.createAlias("e.parent", "p")