Spring Boot中JPA Repository findAll()返回空列表问题求助
问题描述
我正在练习使用Spring Boot开发网页,已创建并连接H2数据库,希望在网页上展示members表的name属性列表。但调用findAll()方法仅返回空列表,请问我的代码哪里存在问题?
相关代码
MemberRepository
package com.example.testproject.store.h2.repository; import com.example.testproject.store.h2.domain.Members; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface MemberRepository extends JpaRepository<Members, Integer> { }
MemberService
package com.example.testproject.store.h2.service; import com.example.testproject.store.h2.domain.Members; import java.util.List; public interface MemberService { List<Members> getAll(); }
MemberServiceImpl
package com.example.testproject.store.h2.service; import com.example.testproject.store.h2.domain.Members; import com.example.testproject.store.h2.repository.MemberRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service(value = "memberServiceImpl") public class MemberServiceImpl implements MemberService { @Autowired private MemberRepository memberRepository; public List<Members> getAll(){ return memberRepository.findAll(); } }
MemberController
package com.example.testproject.controller; import com.example.testproject.store.h2.domain.Members; import com.example.testproject.store.h2.service.MemberService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class MemberController { @Autowired private MemberService memberService; @GetMapping(value = "/members") public List<Members> getAll() { List<Members> users = memberService.getAll(); return users; } }
Members(Entity)
package com.example.testproject.store.h2.domain; import jakarta.persistence.*; @Entity @Table(name = "members") public class Members { @Id private int id; @Column private String name; }
问题排查与解决办法
1. 实体类缺少必要方法
JPA实例化对象、Spring MVC序列化返回结果时,需要无参构造函数和getter方法。你的Members类仅定义私有属性,没有这些方法,会导致无法正确读取属性值,甚至无法实例化对象,最终返回空数据。
修改后的Members实体类:
package com.example.testproject.store.h2.domain; import jakarta.persistence.*; @Entity @Table(name = "members") public class Members { @Id private int id; @Column private String name; // JPA必须的无参构造函数 public Members() {} // 可选:带参构造函数,方便快速创建对象 public Members(int id, String name) { this.id = id; this.name = name; } // getter方法,用于读取属性值 public int getId() { return id; } public String getName() { return name; } // 可选:setter方法,若需要修改数据则添加 public void setId(int id) { this.id = id; } public void setName(String name) { this.name = name; } }
2. 确认H2数据库中存在数据
调用findAll()返回空列表最直接的原因是members表中没有数据。启动项目后,访问H2控制台(默认路径/h2-console),登录后检查表内是否有记录,若没有则手动插入测试数据:
INSERT INTO members(id, name) VALUES(1, '张三'); INSERT INTO members(id, name) VALUES(2, '李四');
3. 检查数据库连接配置
确保application.properties(或application.yml)中的H2配置正确,示例配置如下:
# H2数据库连接配置 spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password= # JPA配置 spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.jpa.show-sql=true # 开启H2控制台 spring.h2.console.enabled=true
注意spring.datasource.url要和H2控制台登录时使用的URL一致,否则会连接到空的数据库实例。
4. 实体类与数据库表映射检查
- 确认
@Table(name = "members")中的表名和数据库实际表名完全匹配(H2默认区分大小写,若数据库表名是大写需调整注解内的名称)。 - 确认
id字段类型和数据库主键字段类型一致(比如数据库中id为INT,实体类中用int是匹配的)。
内容的提问来源于stack exchange,提问作者1jinju
相关产品推荐
相关产品推荐

