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

MySQL查询报错排查、JPA原生查询问题求助及SQL学习资料推荐

问题分析与解决

报错原因拆解

第一个报错:java.sql.SQLSyntaxErrorException: Unknown column 'i' in 'field list'

你开了nativeQuery=true,意味着执行的是原生SQL,但查询语句写的是JPQL语法(select i from Instructor as i)。原生SQL里,i是表的别名,不能直接当查询字段用,得写具体列名或者用*查所有列,比如select * from Instructor as i。

第二个报错:Named parameter lastName not bound

大概率是你中间改了查询语句,比如曾写过:lastName但没绑定对应的@Param("lastName")参数。结合你当前的接口代码来看,现在的查询里并没有:lastName,所以这个报错是临时调整代码导致的,核心要注意参数名和@Param的一致性。

代码问题修正

接口查询语句的冲突问题

当前@Query同时用了nativeQuery=true和JPQL语法,这是核心矛盾,两种修正方案:

方案1:用JPQL(推荐,符合JPA规范)

删掉nativeQuery=true,JPQL会自动映射实体和数据库列,实体类里的firstName对应数据库的name列,JPQL会自动处理映射,不用改字段名:

public interface InstructorDao extends JpaRepository<Instructor, Long> {
    @Query(value = "select i from Instructor as i where i.firstName like %:firstName% or i.lastName like %:firstName%")
    List<Instructor> findInstructorByfirstName(@Param("firstName") String firstName);
}

方案2:保留原生SQL,修正语法

如果必须用原生SQL,要写数据库真实列名,比如firstName对应库表的name列,查询字段改成具体列或*:

public interface InstructorDao extends JpaRepository<Instructor, Long> {
    @Query(nativeQuery=true, value = "select * from Instructor as i where i.name like %:firstName% or i.lastName like %:firstName%")
    List<Instructor> findInstructorByfirstName(@Param("firstName") String firstName);
}

实体类的小问题

你的实体类代码末尾有多余的错误字符:'i' in 'field lis,删掉就能正常编译。

SQL学习资料渠道

  • 数据库官方文档:MySQL、PostgreSQL等各大数据库的官方文档是最权威的,直接搜对应数据库官方文档,里面有全量语法、函数、最佳实践。
  • 官方免费教程:比如Oracle的SQL入门教程、MySQL官方学习路径,系统且免费。
  • 经典技术书籍:《SQL必知必会》(入门)、《高性能MySQL》(进阶MySQL)、《SQL权威指南》(全体系),覆盖从基础到实战的内容。
  • 实战刷题平台:LeetCode的SQL专题、牛客网SQL题库,通过刷题巩固语法和场景思路。
  • 技术社区:Stack Overflow、国内的掘金、CSDN SQL板块,看别人的问题和解决方案,学习实际业务中的用法。

内容的提问来源于stack exchange,提问作者user18583088

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:25:16