如何编写不含原生查询、带JOIN操作的JPA派生查询?
JPA派生查询实现对应SQL的方案
首先明确原SQL逻辑:从USERS.NAMES表内连接USERS.ADDRESS表,关联条件为两张表USERS_ID相等且ADDRESS_TYPE在指定值列表中,同时筛选NAMES_ID等于指定值的记录,最终返回Names实体列表。
实现步骤
确认实体类关联关系
假设已定义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省略 }编写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
相关产品推荐
相关产品推荐

