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

如何编写不含原生查询、带JOIN操作的JPA派生查询?

JPA派生查询实现对应SQL的方案

首先明确原SQL逻辑:从USERS.NAMES表内连接USERS.ADDRESS表,关联条件为两张表USERS_ID相等且ADDRESS_TYPE在指定值列表中,同时筛选NAMES_ID等于指定值的记录,最终返回Names实体列表。

实现步骤

  1. 确认实体类关联关系
    假设已定义Names和Address实体类,需在Names中添加与Address的关联映射(对应SQL的JOIN逻辑):

    @Entity
    @Table(name = "NAMES", schema = "USERS")
    public class Names {
        @Id
        @Column(name = "NAMES_ID")
        private Long namesId;
    
        @Column(name = "USERS_ID")
        private Long usersId;
    
        // 内关联Address实体,通过USERS_ID字段匹配
        @OneToMany
        @JoinColumn(name = "USERS_ID", referencedColumnName = "USERS_ID", insertable = false, updatable = false)
        private List<Address> addresses;
    
        // 其他字段、getter/setter省略
    }
    
    @Entity
    @Table(name = "ADDRESS", schema = "USERS")
    public class Address {
        @Column(name = "ADDRESS_TYPE")
        private String addressType;
    
        @Column(name = "USERS_ID")
        private Long usersId;
    
        // 其他字段、getter/setter省略
    }
    
  2. 编写JPA派生查询方法
    在NamesRepository接口中定义如下方法,JPA会自动根据方法名解析生成对应SQL:

    public interface NamesRepository extends JpaRepository<Names, Long> {
        // 方法名规则:findBy[实体字段]And[关联实体].[关联字段]In
        List<Names> findByNamesIdAndAddressesAddressTypeIn(Long namesId, List<String> addressTypes);
    }
    

方法名说明

  • findByNamesId:匹配Names实体的namesId字段等于传入值
  • AndAddressesAddressTypeIn:匹配关联的Address实体集合中,存在addressType属于传入列表的记录(JPA自动处理内连接逻辑,对应原SQL的JOIN条件)

使用示例

调用方法时传入参数即可:

List<String> addressTypes = Arrays.asList("value1", "value2");
List<Names> result = namesRepository.findByNamesIdAndAddressesAddressTypeIn(123L, addressTypes);

内容的提问来源于stack exchange,提问作者cs55

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:05:26