SpringBoot中如何实现两表子查询的Repository配置与对应实体定义?
实现方式说明
你现在的查询最终返回的还是TABLE1的全量字段,不需要修改原有DisplayEntity的定义,有两种常用实现方案:
方案1:原生SQL查询(无需新增额外实体,最简便)
直接在@Query注解中开启原生SQL模式,直接写你的业务SQL即可:
@Repository public interface DisplayDataRepository extends CrudRepository<DisplayEntity, Long> { // 开启nativeQuery = true 走原生SQL解析,参数用占位符避免硬编码和SQL注入 @Query(value = "select * from TABLE1 where COL1 = (select COL2 from TABLE2 where COL3 = :inputData) or COL1 = :inputData", nativeQuery = true) List<DisplayEntity> findMatchingData(String inputData); }
方案2:JPQL查询(需要新增TABLE2对应的实体类)
如果需要用JPQL规范实现,先新增TABLE2对应的实体:
@Entity @Table(name = "TABLE2") public class Table2Entity implements Serializable { @Column(name = "COL2") private String col2; @Column(name = "COL3") private String col3; // 补充主键字段、getter、setter方法 }
再在Repository中写JPQL语句,注意JPQL用实体属性名而非数据库列名:
@Repository public interface DisplayDataRepository extends CrudRepository<DisplayEntity, Long> { @Query("from DisplayEntity d where d.someVariable = (select t.col2 from Table2Entity t where t.col3 = :inputData) or d.someVariable = :inputData") List<DisplayEntity> findMatchingData(String inputData); }
注意事项
- 如果你后续需要返回两张表的混合字段,才需要自定义结果接收类或用
Object[]作为返回值,你当前的需求只返回TABLE1字段,原有实体可以直接复用。 - 原生SQL模式下要注意SQL语法和你使用的数据库类型匹配,不要遗漏
nativeQuery = true属性,否则默认按JPQL解析会抛出语法错误。 - 不建议在SQL中硬编码固定值,替换为方法入参占位符更灵活也更安全。
内容的提问来源于stack exchange,提问作者Pratyush Narain
相关产品推荐
相关产品推荐

