Spring Data JPA:多对多关系的JPQL多表内连接查询实现
原生SQL转JPQL多表连接及过滤查询问题
我有三个存在多对多关联关系的实体:Packages <--> 连接表 <--> ProtectedItems <--> 连接表 <--> ContentItems。需要查询所有与指定ContentItems关联的Packages,目前使用带内连接的原生SQL查询,代码如下:
SELECT ci.stream_id, p.package_id, p.package_name FROM packages p INNER JOIN jt_packages_protected_items jtppi ON p.account_id=jtppi.p_account_id AND p.package_id=jtppi.package_id INNER JOIN protected_items pi ON jtppi.pi_account_id=pi.account_id AND jtppi.protected_item_id=pi.protected_item_id INNER JOIN jt_protected_items_stream_mappings jtpism ON pi.account_id=jtpism.pi_account_id AND pi.protected_item_id=jtpism.protected_item_id INNER JOIN content_items ci ON jtpism.ci_account_id=ci.account_id AND jtpism.content_id_extension=ci.content_id_extension
请问如何将上述原生SQL转换为JPQL查询?主要想了解JPQL中如何实现多表连接。
补充问题
在@Eugene的回答后,我希望同时按packageId过滤结果,尝试了两种写法:
- 写法1(无法编译):
@Query("SELECT p2 from (SELECT p FROM Packages p WHERE p.packageId.packageId=1) as p2 inner join pp.protectedItems pi inner join pi.streamMappings ci WHERE ci.streamId=:streamId")
- 写法2(可行,但需确认正确性与最优性):
@Query("SELECT p FROM Packages p inner join p.protectedItems pi inner join pi.streamMappings ci WHERE ci.streamId=:streamId AND p.packageId.packageId=:packageId")
请问写法2是否正确、是否为最优实现?若有更好方案请建议。
内容的提问来源于stack exchange,提问作者samshers
相关产品推荐
相关产品推荐

