You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:45:41