Пустой ответ в Java Spring Boot Hibernate JPA + PostgreSQL

Я новичок в Java и пытаюсь создать простое веб-приложение для функций CRUD с использованием RestfulAPI.

Сотрудник.java

package project.test.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;

import java.util.Date;

@Entity
@Data
@Getter
@Setter
@Table(name = "Employee")
public class Employee {
    @Id
    @Column(name = "EmployeeID")
    private String EmployeeID;

    @Column(name = "FirstName")
    private String FirstName;

    @Column(name = "MiddleName")
    private String MiddleName;

    @Column(name = "LastName")
    private String LastName;

    public Employee() {

    }

    public Employee(String EmployeeID, String FirstName, String MiddleName, String LastName) {
        super();
        this.EmployeeID = EmployeeID;
        this.FirstName = FirstName;
        this.MiddleName = MiddleName;
        this.LastName = LastName;
    }

    public String getEmployeeID() {
        return EmployeeID;
    }

    public void setEmployeeID(String EmployeeID) {
        this.EmployeeID = EmployeeID;
    }

    public String getFirstName() {
        return FirstName;
    }

    public void setFirstName(String FirstName) {
        this.FirstName = FirstName;
    }

    public String getMiddleName() {
        return MiddleName;
    }

    public void setMiddleName(String MiddleName) {
        this.MiddleName = MiddleName;
    }

    public String getLastName() {
        return LastName;
    }

    public void setLastName(String LastName) {
        this.LastName = LastName;
    }

}

СотрудникРепозиторий.java

package project.test.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import project.test.entity.Employee;

public interface EmployeeRepository extends JpaRepository<Employee, String> {
}

РаботникService.java

package project.test.service;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import project.test.entity.Employee;
import project.test.repository.EmployeeRepository;

@Service
public class EmployeeService {
    @Autowired
    private EmployeeRepository employeeRepository;

    public List<Employee> getAllEmployees() {
        return employeeRepository.findAll();
    }
}

СотрудникController.java

package project.test.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 project.test.entity.Employee;
import project.test.service.EmployeeService;

@RestController
@RequestMapping("/api")
public class EmployeeController {
    @Autowired
    private EmployeeService employeeService;

    // Get all employees
    @GetMapping("/Employee")
    public List<Employee> getAllEmployees() {
        return employeeService.getAllEmployees();
    }
}

Когда я загружаю localhost:8080/api/Employee, он показывает пустой список, хотя у меня уже есть данные в таблице «Сотрудник» в базе данных PostgreSQL. Вот мое выполнение SQL в Hibernate:

Hibernate: select e1_0.EmployeeID,e1_0.FirstName,e1_0.LastName,e1_0.MiddleName from Employee e1_0

Может ли кто-нибудь сказать мне, почему он не отвечает на данные JSON должным образом?

Подключите отладчик к своей программе, поставьте точку останова в контроллере и посмотрите, что происходит.

tgdavies 04.04.2024 08:52

Как вы думаете, где проблема? Надеюсь, вы понимаете, что дело не в ответе на выходные данные JSON.

Roman C 04.04.2024 10:13

Я думаю, что проблема может быть связана с SQL-запросом: когда я запускаю SQL-запрос Hibernate в PostgreSQL, он возвращает пустую таблицу (которая, как я предполагаю, создается сама). SQL-запрос, который работает в PostgreSQL, выглядит следующим образом: SELECT «EmployeeID», «FirstName», «MiddleName», «LastName» FROM «Employee». Я пробовал: выберите e1_0.EmployeeID,e1_0.FirstName,e1_0.LastName, e1_0.MiddleName от сотрудника e1_0 (я не знаю, является ли здесь проблемой e1_0). Я не знаю, как заставить findAll() генерировать правильный SQL.

Alan 04.04.2024 10:18

А база данных запросов возвращает пустые результаты?

Roman C 04.04.2024 10:29

ВЫБЕРИТЕ «EmployeeID», «FirstName», «MiddleName», «LastName» FROM «Employee». Этот запрос работает и возвращает данные в PostgreSQL. выберите e1_0.EmployeeID,e1_0.FirstName,e1_0.LastName,e1_0.MiddleName от сотрудника e1_0. Этот запрос Hibernate, который я взял из терминала, не работает и возвращает пустую таблицу.

Alan 04.04.2024 10:32

Использует ли ваша база данных имена таблиц с учетом регистра?

Roman C 04.04.2024 10:54

Нет, это не так. Я понял, что проблема в кавычках. @Hudson предложил решение ниже, но мне все еще интересно, есть ли какие-либо решения с использованием метода findAll().

Alan 04.04.2024 11:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, вам не хватает @Repository в классе вашего репозитория. Можете ли вы добавить @Repository в EmployeeRepository и попробовать еще раз?

@Repository
public interface EmployeeRepository extends JpaRepository<Employee,String>

Я действительно попробовал, но он все еще не ответил.

Alan 04.04.2024 09:22

Можете ли вы убедиться, что ваше приложение подключается к нужной базе данных? Можете ли вы предоставить файл application.properties?

Kezlo 04.04.2024 09:33

Я уверен, что он подключается к нужной базе данных, потому что ранее я пытался создать новую таблицу для базы данных, и это действительно сработало. ``` Spring.datasource.url=jdbc:postgresql://localhost:5432/HRDat‌​abase Spring.datasource.username=postgres Spring.datasource.password=postgres Spring.jpa.properties.hibernate.dialect = org.hibernate. диалект.PostgreSQLDialect Spring.jpa.hibernate.ddl-auto=update Spring.jpa.hibernate.naming.physical-strategy=org.hibernate.‌​boot.model.naming.Ph‌​ysicalNamingStrategy‌​StandardImpl Spring.jpa.show-sql = истина ```

Alan 04.04.2024 09:39

Пробовали ли вы вручную запустить журнал выполнения Hibernate SQL с помощью Postgres?

Kezlo 04.04.2024 09:43

Добавление @Repository в репозиторий Spring Data не даст никакого эффекта, а только добавит код/беспорядок.

M. Deinum 04.04.2024 10:06

Я думаю, @Kezlo заметил проблему. Когда я запускаю SQL-запрос Hibernate в PostgreSQL, он возвращает пустую таблицу (которая, как я предполагаю, создается сама). SQL-запрос, который работает в PostgreSQL, выглядит следующим образом: SELECT «EmployeeID», «FirstName», «MiddleName», «LastName» FROM «Employee». Я пробовал: выберите e1_0.EmployeeID,e1_0.FirstName,e1_0.LastName, e1_0.MiddleName от сотрудника e1_0 (я не знаю, является ли здесь проблемой e1_0). Я не знаю, как заставить findAll() генерировать правильный SQL.

Alan 04.04.2024 10:17
Ответ принят как подходящий

Итак, если вы не хотите использовать findAll(), вы можете использовать @Query, чтобы напрямую написать правильный запрос, и я могу быть уверен, что он работает в PostgreSQL:

@Query(value = "SELECT \"EmployeeID\", \"FirstName\", \"MiddleName\", \"LastName\" FROM \"Employee\"", nativeQuery = true)
    List<Employee> NqgetAllEmployees();

Сложная часть методов репозитория (в частности, в ситуации с PostgreSQL) — это кавычки, которые могут привести к неправильному пониманию PostgreSQL, и вместо того, чтобы перезаписывать методы, я думаю, проще написать прямой запрос.

Было бы неплохо, если бы кто-нибудь мог сказать, что лучше: методы репозитория или собственный запрос.

Другие вопросы по теме