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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:05:15