我需要有关Spring JPA的帮助。
我有一个请求中附带的ID,我需要检索2个字段-itemsOrdered,itemDelivered从2个表中。
表A的ID(来自请求)为PK。 表A与表B具有外键关系。 表B与表C,表D具有外键关系。
现在要阅读itemsOrdered,itemDelivered,我要一一阅读。
A a = CrudRepository.findOne(id from request);
B b = CrudRepository.findOne(A.getID());
C c = CrudRepository.findOne(B.getID());
D d = CrudRepository.findOne(B.getID());
反正有进行联接的步骤,以便我可以一步完成C.itemsOrdered和d.itemsDelivered吗?
答案 0 :(得分:1)
如果您使用的是Hibernate 5.1+(或简单地说是Spring Boot 2.0+),则可以像常规SQL一样在JPQL查询中使用“带条件联接”,例如:
select
c.itemsOrdered,
d.itemsDelivered
from
A a
join B b on b.a_id = a.id
join C c on c.b_id = b.id
join D d on d.b_id = b.id
where
a.id = ?1
借助projections,您可以轻松地检索这些字段:
public interface TwoFieldsProjection {
Long getItemsOrdered();
Long getItemsDelivered();
}
@Query("select c.itemsOrdered as itemsOrdered, d.itemsDelivered as itemsDelivered from A a join B b on b.a_id = a.id join C c on c.b_id = b.id join D d on d.b_id = b.id where a.id = ?1")
Optional<TwoFieldsProjection> getTwoFields(Long aId);
请注意在查询(c.itemsOrdered as itemsOrdered
)中使用别名,该别名必须与投影中的getter匹配。