
spring boot 项目中使用 jpa 查询 mysql 数据库时返回多个空 json 对象(如 [{}, {}, {}]),根本原因在于实体类字段命名与 lombok 生成的 getter/setter 不匹配,导致序列化失败。
spring boot 项目中使用 jpa 查询 mysql 数据库时返回多个空 json 对象(如 [{}, {}, {}]),根本原因在于实体类字段命名与 lombok 生成的 getter/setter 不匹配,导致序列化失败。
在你提供的代码中,Book 实体类字段全部采用大驼峰命名(如 private String ISBN;、private String Name;),而 JPA 和 Jackson(Spring Boot 默认 JSON 序列化器)均遵循 Java Bean 规范:getter/setter 方法名由字段名按驼峰规则推导,且首字母小写。Lombok 的 @Getter 和 @Setter 注解正是基于此规则自动生成方法 —— 例如字段 Name 会生成 getName() 和 setName(String);但 Name 并非合法的 Java Bean 属性名(标准应为 name),导致 Jackson 在序列化时无法识别对应 getter,最终所有字段被忽略,输出为空对象 {}。
此外,@Id 字段标注为 String ISBN,但主键策略却配置为 GenerationType.IDENTITY(依赖数据库自增整数),这会造成插入异常(虽未在查询中暴露,但属严重设计矛盾)。
✅ 正确做法是:统一使用小驼峰命名法定义字段,并确保与数据库列名通过 @Column(name = "...") 显式映射。修改后的 Book.java 如下:
package com.example.demo.model;
import jakarta.persistence.*;
import lombok.Data;
@Data
@Entity
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 若 isbn 是自增主键,需确保数据库列为 INT + AUTO_INCREMENT
@Column(name = "isbn")
private Long id; // 推荐用 Long 或 Integer 作为主键类型;若实际 isbn 是字符串主键,请改用 @GeneratedValue(strategy = GenerationType.IDENTITY) 不适用!
@Column(name = "isbn") // 若业务上需保留 isbn 字段值(非主键),单独声明
private String isbn;
@Column(name = "name")
private String name;
@Column(name = "author")
private String author;
@Column(name = "introduction")
private String introduction;
}
⚠️ 关键修正说明:
- 字段名全部转为小驼峰(isbn, name, author, introduction),Lombok 自动生成 getIsbn(), getName() 等标准 getter;
- 移除冗余的 @Getter/@Setter(@Data 已包含);
- 主键字段 id 使用 Long 类型 + IDENTITY 策略(适配 MySQL AUTO_INCREMENT);若 isbn 确实是字符串主键(如 ISBN-13),则应去掉 @GeneratedValue,并确保数据库该列为 VARCHAR 且唯一,此时主键类型改为 String;
- @Column(name = "...") 严格对应数据库实际列名(区分大小写需注意 MySQL 表名/列名是否启用大小写敏感)。
同时检查 BookRepository 的泛型参数是否匹配主键类型:
// 若主键为 Long,则保持:
public interface BookRepository extends CrudRepository<book long> { }</book>
最后验证:重启应用,访问 http://localhost:8181/allbook,将正确返回带字段数据的 JSON 数组,如:
[
{"id":1,"isbn":"978-0-306-40615-7","name":"Effective Java","author":"Joshua Bloch","introduction":"A must-read for Java developers..."},
...
]
? 总结:Spring Boot 数据访问问题常隐藏于“看似无错”的细节中。务必遵守 Java Bean 命名规范、明确主键策略与数据库类型的匹配,并善用 spring.jpa.show-sql=true 和日志观察 SQL 执行与结果映射过程。











