使用@Query注解通过proNo查询fno时SQL执行错误如何解决?
错误原因排查
- JPQL语法规则不匹配:你设置了
nativeQuery = false代表使用JPQL查询,JPQL是面向Java实体类的查询语言,需要使用实体类名和实体类属性名编写语句,你当前语句里直接用了数据库表名files、数据库下划线字段名pro_no,不符合JPQL语法要求。 - 参数未正确绑定:语句中直接写了
proNo没有加参数前缀,JPQL/原生SQL都无法识别这是传入的方法参数,会被识别为表字段导致报错。 - 可选排查点:确认实体类中
fno字段的类型是否和方法返回值Integer匹配,类型不匹配也会抛出转换异常。
修复方案
方案1:保留JPQL查询(推荐)
按照你的实体类定义调整查询语句的表名、字段名,同时补充参数占位符即可,示例代码如下(需将语句中的File替换为你自己的实体类名,proNo替换为你实体类中对应项目编号的属性名):
@Query(value = "select f.fno from File f where f.proNo = :proNo") Integer findFno(@Param("proNo") Long proNo);
说明:nativeQuery默认值为false,可以省略不写,参数前加:即可关联@Param标注的同名参数。
方案2:改为原生SQL查询
如果需要直接使用数据库表名、字段名编写语句,将nativeQuery设置为true,同时补充参数占位符即可:
@Query(value = "select f.fno from files f where f.pro_no = :proNo", nativeQuery = true) Integer findFno(@Param("proNo") Long proNo);
额外优化建议
- 如果查询结果可能为空,建议将返回值改为
Optional<Integer>,避免调用时出现空指针异常。 - 若
fno字段在数据库中是bigint类型,对应Java的Long类型,需要将方法返回值调整为Long避免类型转换错误。
内容的提问来源于stack exchange,提问作者Hannah
相关产品推荐
相关产品推荐

