**问题:**我在尝试使用Sping Boot 和Hibernate从MySQL数据库中获取数据时遇到问题。尽管配置了应用程序属性和存储库接口,但当我使用findAll()方法查询数据库时,我还是收到了空实体作为结果。以下是我的设置摘要:
**问题:**我有一个Sping Boot 应用程序使用Hibernate for JPA。我已经application.properties用必要的数据库连接细节和方言配置了www.example.com文件。我还创建了实体类和相应的存储库接口。然而,当我使用findAll()方法时,我得到的是一个空实体数组。
详细信息:
1.我有一个用@Entity注解的问题实体类。
1.我已经创建了扩展JpaRepository<question,question>的JpaDao接口。
1.在application.properties中,我设置了数据库连接属性,包括URL、用户名和密码。
1.我使用Hibernate和MySQL方言org.hibernate.dialect.MySQL8Dialect。
1.我已经为Hibernate和Sping Boot 启用了DEBUG级别的日志记录以获取更多信息。
`
# Entity
package com.boot.quizapp;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Data;
@Data
@Entity
public class Question {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
private Integer id;
private String questionTitle;
private String option1;
private String option2;
private String option3;
private String option4;
private String rightAnswer;
private String difficultylevel;
private String category;
}
# DAO
package com.boot.quizapp.dao;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.boot.quizapp.Question;
@Repository
public interface QuestionDao extends JpaRepository<Question, Integer> {
}
# Service
package com.boot.quizapp.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.boot.quizapp.Question;
import com.boot.quizapp.dao.QuestionDao;
@Service
public class QuestionService {
QuestionDao questionDao;
@Autowired
public QuestionService(QuestionDao questionDao) {
this.questionDao = questionDao;
}
public List<Question> getAllQuestions() {
return questionDao.findAll();
}
}
# Controller
package com.boot.quizapp.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.boot.quizapp.Question;
import com.boot.quizapp.service.QuestionService;
@RestController
@RequestMapping("/question")
public class QuestionController {
@Autowired
QuestionService questionService;
@GetMapping("/allQuestions")
public List<Question> getAllQuestions() {
return questionService.getAllQuestions();
}
}
# application.properties
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/quizapp
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.show-sql=true
## Hibernate Properties
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
logging.level.org.hibernate.SQL=DEBUG
# Hibernate properties
spring.jpa.hibernate.ddl-auto=update
# Database Schema
-- Table: question
CREATE TABLE question (
id INT PRIMARY KEY,
question_title VARCHAR(255),
option1 VARCHAR(255),
option2 VARCHAR(255),
option3 VARCHAR(255),
option4 VARCHAR(255),
right_answer VARCHAR(255),
difficultylevel VARCHAR(255),
category VARCHAR(255)
);
-- Sample Data
INSERT INTO question (id, category, difficultylevel, option1, option2, option3, option4, question_title, right_answer )
VALUES
(1, 'Science', 'Easy', 'Option A', 'Option B', 'Option C', 'Option D', 'Sample Question 1', 'Option A');
故障排除步骤:
1.我已经验证了数据库表中有记录。
1.我已经检查了实体类中的列名是否与表的列名匹配。
1.我试过将方言更改为不同版本的MySQL方言。
**Expected Outcome:**我期望findAll()方法从数据库中检索数据,并返回填充实体对象的列表。但是,我只得到一个空实体数组。
**控制台输出:**当我启用DEBUG级别日志记录时,我看到一个查询正在执行,但似乎没有数据被提取。
Hibernate: select q1_0.id,q1_0.category,q1_0.difficultylevel,q1_0.option1,q1_0.option2,q1_0.option3,q1_0.option4,q1_0.question_title,q1_0.right_answer from question q1_0
[ {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {} ]
有没有人可以帮助我找出可能导致这个问题的原因?如有任何关于故障排除或纠正我的配置的建议,我将不胜感激。
1条答案
按热度按时间v1l68za41#
我试着在我的系统上复制你的代码,它工作了。
github.com/AjinkyaKarode10/QuizzAppDemo/tree/main。
这看起来像是Lombok插件安装问题。
当我们使用Eclipse和SpringToolSuite等IDE时,通常会出现这种情况。
如果我们可以在Entity类中手动添加getter/setter,那就更好了。
或者通过参考下面的网站安装Lombok插件。
Lombok is not generating getter and setter。
Question.class
另外,直接在响应中返回从数据库返回的结果被认为是一种不好的做法。
请将DB结果Map到相同的DTO对象,并在响应中返回DTO对象。
试试mapstruct。
谢谢你