Spring JPA Repository查询返回Null,但数据库执行同查询有结果
问题排查:Spring JPA Repository返回Null但原生SQL有结果
我帮你梳理了几个关键问题,这应该就是导致你遇到的现象的核心原因:
1. 主键映射完全错位(最关键问题)
看你的数据库建表语句,主键定义的是TAX_FORM_ID,但你的表结构里根本没有这个列——你实际定义的非空列是EMPLOYEE_FORM_ID,而实体类里把@Id标注在了EMPLOYEE_FORM_ID对应的ordem字段上。
JPA依赖主键来识别实体并完成结果映射,这种主键定义和实体映射完全不匹配的情况,会导致即使原生SQL查到了数据,JPA也无法正确构建出实体对象,最终返回空结果或者null。
修复方案:
修正建表语句的主键定义,改成正确的EMPLOYEE_FORM_ID:
CREATE TABLE EMPLOYEE_FORM ( "EMPLOYEE_FORM_ID" CHAR(12 BYTE) NOT NULL ENABLE, "FORM_TYPE_CD" CHAR(12 BYTE) DEFAULT ' ' NOT NULL ENABLE, PRIMARY KEY ("EMPLOYEE_FORM_ID") );
2. Native Query结果映射不完整
你用了nativeQuery = true,但查询语句只返回了EMPLOYEE_FORM_ID一列,可你的实体类里还有FORM_TYPE_CD对应的regiaoTributaria字段。当JPA尝试把原生查询结果映射到实体类时,会期望找到所有实体字段对应的列值,缺失的话可能导致对象无法正常实例化。
修复方案:
- 如果只需要获取
EMPLOYEE_FORM_ID,直接把返回类型改成List<String>更简单:
public interface RelatorioContribuinteInadimplenteRepository extends JpaRepository<RelatorioContribuinteInadimplenteView, String>{ @Transactional(readOnly = true, timeout = 600) @Query(value = " SELECT EMPLOYEE_FORM_ID FROM EMPLOYEE_FORM WHERE FORM_TYPE_CD = ?1 ", nativeQuery = true) List<String> findByFilters(String code); }
- 如果确实需要返回实体类,要确保查询语句返回所有实体字段:
@Transactional(readOnly = true, timeout = 600) @Query(value = " SELECT EMPLOYEE_FORM_ID, FORM_TYPE_CD FROM EMPLOYEE_FORM WHERE FORM_TYPE_CD = ?1 ", nativeQuery = true) List<RelatorioContribuinteInadimplenteView> findByFilters(String code);
3. 额外注意:CHAR类型的参数匹配
你的FORM_TYPE_CD是CHAR(12)类型,默认值是空格。如果传入的code参数长度不足12位,数据库会自动补空格,但JPA传参时不会自动补全——比如你传"ABC",数据库里的实际值是"ABC ",这时候查询条件就匹配不上。不过你说数据库跑相同SQL有结果,这个可能不是当前问题,但后续如果遇到参数不匹配的情况,可以留意这一点,比如手动补全空格或者用TRIM()函数处理。
内容的提问来源于stack exchange,提问作者Wonder Woman
相关产品推荐
相关产品推荐

