简单SQL查询对应的JPA Query编写 含IN嵌套子查询示例
对应SQL的JPA Query实现方案
以下给出两种常用实现方式,你可以根据业务场景选择:
方式1:JPQL查询(面向实体,兼容所有支持JPA的数据库)
前提:你已经定义好了对应两张表的实体类:TableA 映射tableA表,主键属性为id;TableB映射tableB表,关联字段对应属性为extId。
写法如下:
// 写在TableA对应的Repository接口中 @Query("SELECT a FROM TableA a WHERE a.id IN (SELECT DISTINCT b.extId FROM TableB b)") List<TableA> findAllQualifiedTableA();
如果需要分页,直接追加Pageable类型的入参,返回值替换为Page<TableA>即可自动适配分页逻辑。
方式2:原生SQL查询(和你提供的原SQL完全一致,适配复杂特殊场景)
如果子查询逻辑比较复杂,或者有数据库特有的语法需要用,可以直接走原生SQL查询:
// 写在TableA对应的Repository接口中 @Query(value = "SELECT * FROM tableA a WHERE id IN (SELECT DISTINCT extId FROM tableB)", nativeQuery = true) List<TableA> findAllQualifiedTableAByNative();
注意事项
- 原生SQL必须显式声明
nativeQuery = true参数,否则JPA会按照JPQL语法解析,抛出语法错误 - 如果两张表的关联逻辑固定,也可以直接在实体类中配置关联注解,用关联查询替代子查询,性能表现更优
- 需要传入动态参数时,可以用
?1占位符对应方法第一个参数,或者用@Param("参数名")绑定命名参数,灵活适配业务变化
内容的提问来源于stack exchange,提问作者A K
相关产品推荐
相关产品推荐

