Spring JPA findByUsername方法执行SQL语句报错求助
问题排查与解决方案
针对你开发餐饮评论API时遇到的两个问题:自定义findByUsername方法SQL语法错误、请求JSON中username拼写错误不报错但字段为null,给出以下排查和解决步骤:
一、解决SQL语法错误
1. 校验Repository方法与Model字段的匹配性
Spring Data JPA的方法命名依赖Model字段名,确保:
- Model类中存在完全匹配的
username字段(大小写一致,比如不要Model里是userName,方法写findByUsername) - 如果数据库列名和Model字段名不一致,用
@Column注解明确映射:
@Column(name = "user_name") // 对应数据库列名 private String username;
2. 打印SQL语句定位错误
在配置文件中开启SQL日志,直接查看自动生成的SQL哪里有语法问题:
# application.properties spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true
通过日志可以直观看到列名拼写、关键字冲突等问题,比如是否出现了数据库不允许的关键字,或者列名错误。
3. 改用手动SQL查询(可选)
如果自动生成的SQL有问题,直接用@Query注解写原生或JPQL语句:
// JPQL写法 @Query("SELECT u FROM User u WHERE u.username = :username") User findByUsername(@Param("username") String username); // 原生SQL写法(如果需要) @Query(value = "SELECT * FROM user WHERE username = :username", nativeQuery = true) User findByUsername(@Param("username") String username);
二、解决字段拼写错误不报错的问题
默认Jackson会忽略未知字段,导致拼写错误的字段不会触发报错,而是将正确字段设为null,可以通过以下方式开启严格校验:
1. 全局配置
在application.properties中添加:
spring.jackson.deserialization.fail-on-unknown-properties=true
这样请求JSON中出现Model没有的字段时,会直接抛出JsonMappingException,快速定位拼写错误。
2. 局部配置(针对单个Model)
如果不想全局开启,在Model类上添加注解:
@JsonIgnoreProperties(ignoreUnknown = false) public class User { private String username; // 其他字段、getter/setter }
额外检查点
- 确认请求的
Content-Type头是application/json,否则Spring MVC无法正确解析JSON参数 - 确保Model类的
username字段有正确的getter和setter方法,属性绑定依赖这些方法
内容的提问来源于stack exchange,提问作者Jboyd34
相关产品推荐
相关产品推荐

