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
相关产品推荐
相关产品推荐

