使用Sping Boot 和Hibernate从数据库中获取数据时出错

at0kjp5o  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(161)

**问题:**我在尝试使用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
[ {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {} ]
有没有人可以帮助我找出可能导致这个问题的原因?如有任何关于故障排除或纠正我的配置的建议,我将不胜感激。

v1l68za4

v1l68za41#

我试着在我的系统上复制你的代码,它工作了。
github.com/AjinkyaKarode10/QuizzAppDemo/tree/main
这看起来像是Lombok插件安装问题。
当我们使用Eclipse和SpringToolSuite等IDE时,通常会出现这种情况。
如果我们可以在Entity类中手动添加getter/setter,那就更好了。
或者通过参考下面的网站安装Lombok插件。
Lombok is not generating getter and setter
Question.class

import jakarta.persistence.*;
import lombok.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;

    public Integer getId() {
        return id;
    }

    public String getQuestionTitle() {
        return questionTitle;
    }

    public String getOption1() {
        return option1;
    }

    public String getOption2() {
        return option2;
    }

    public String getOption3() {
        return option3;
    }

    public String getOption4() {
        return option4;
    }

    public String getRightAnswer() {
        return rightAnswer;
    }

    public String getDifficultylevel() {
        return difficultylevel;
    }

    public String getCategory() {
        return category;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public void setQuestionTitle(String questionTitle) {
        this.questionTitle = questionTitle;
    }

    public void setOption1(String option1) {
        this.option1 = option1;
    }

    public void setOption2(String option2) {
        this.option2 = option2;
    }

    public void setOption3(String option3) {
        this.option3 = option3;
    }

    public void setOption4(String option4) {
        this.option4 = option4;
    }

    public void setRightAnswer(String rightAnswer) {
        this.rightAnswer = rightAnswer;
    }

    public void setDifficultylevel(String difficultylevel) {
        this.difficultylevel = difficultylevel;
    }

    public void setCategory(String category) {
        this.category = category;
    }
}

另外,直接在响应中返回从数据库返回的结果被认为是一种不好的做法。
请将DB结果Map到相同的DTO对象,并在响应中返回DTO对象。
试试mapstruct。
谢谢你

相关问题