Spring Data JPA派生查询返回0条记录但@Query原生查询正常是什么原因?
核心问题原因
你的原生SQL写法错误,返回的是不符合业务逻辑的匹配结果,派生查询的逻辑才是正确的
你写的原生SQL没有关联batch和institute的外键关系,属于笛卡尔积查询:
SELECT * FROM batch b, institute i WHERE b.batch_id = :batchId AND i.inst_id = :instituteId
只要batch表存在对应batch_id的记录、institute表存在对应institute_id的记录,不管这个batch是不是属于这个institute,都会返回结果,所以你误以为原生查询是对的,实际上它返回的是不符合关联关系的错误结果。
而派生方法生成的SQL完全符合业务逻辑:
select ... from batch batchentit0_ where batchentit0_.batch_id=? and batchentit0_.inst_id=?
它会查询batch_id匹配,且该batch关联的inst_id和你传入的InstituteEntity主键匹配的记录,返回0条说明你的数据库里确实不存在符合这个关联关系的记录。
其他可能导致派生查询无结果的排查点
- 传入的
InstituteEntity参数是游离对象/未初始化的代理对象,主键instId没有正确赋值
JPA用关联对象作为查询条件时,默认会取关联对象的主键作为匹配值,如果你的institute参数的instId为null,或者是懒加载生成的未初始化代理,可能会导致参数绑定错误。建议直接传主键ID,把派生方法改成:Optional<BatchEntity> findByBatchIdAndInstitute_InstId(Long batchId, Long instId); - JPA命名策略和字段映射不匹配
检查你的BatchEntity的institute字段@JoinColumn配置和实际表字段是否一致,如果你显式指定了@JoinColumn(name = "instId"),但实际表字段是inst_id,也会导致匹配失败,需要修正为@JoinColumn(name = "inst_id") - 参数绑定顺序错误
确认你调用派生方法时,第一个参数传的是batchId,第二个参数传的是InstituteEntity对象,不要搞反参数顺序。
内容的提问来源于stack exchange,提问作者mAsK
相关产品推荐
相关产品推荐

