You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:21:10