Я новичок в 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 должным образом?
Как вы думаете, где проблема? Надеюсь, вы понимаете, что дело не в ответе на выходные данные JSON.
Я думаю, что проблема может быть связана с 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.
А база данных запросов возвращает пустые результаты?
ВЫБЕРИТЕ «EmployeeID», «FirstName», «MiddleName», «LastName» FROM «Employee». Этот запрос работает и возвращает данные в PostgreSQL. выберите e1_0.EmployeeID,e1_0.FirstName,e1_0.LastName,e1_0.MiddleName от сотрудника e1_0. Этот запрос Hibernate, который я взял из терминала, не работает и возвращает пустую таблицу.
Использует ли ваша база данных имена таблиц с учетом регистра?
Нет, это не так. Я понял, что проблема в кавычках. @Hudson предложил решение ниже, но мне все еще интересно, есть ли какие-либо решения с использованием метода findAll().




Я думаю, вам не хватает @Repository в классе вашего репозитория. Можете ли вы добавить @Repository в EmployeeRepository и попробовать еще раз?
@Repository
public interface EmployeeRepository extends JpaRepository<Employee,String>
Я действительно попробовал, но он все еще не ответил.
Можете ли вы убедиться, что ваше приложение подключается к нужной базе данных? Можете ли вы предоставить файл application.properties?
Я уверен, что он подключается к нужной базе данных, потому что ранее я пытался создать новую таблицу для базы данных, и это действительно сработало. ``` Spring.datasource.url=jdbc:postgresql://localhost:5432/HRDatabase 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.PhysicalNamingStrategyStandardImpl Spring.jpa.show-sql = истина ```
Пробовали ли вы вручную запустить журнал выполнения Hibernate SQL с помощью Postgres?
Добавление @Repository в репозиторий Spring Data не даст никакого эффекта, а только добавит код/беспорядок.
Я думаю, @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.
Ваш ответ можно улучшить, добавив дополнительную вспомогательную информацию. Пожалуйста, отредактируйте , чтобы добавить дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.
Итак, если вы не хотите использовать findAll(), вы можете использовать @Query, чтобы напрямую написать правильный запрос, и я могу быть уверен, что он работает в PostgreSQL:
@Query(value = "SELECT \"EmployeeID\", \"FirstName\", \"MiddleName\", \"LastName\" FROM \"Employee\"", nativeQuery = true)
List<Employee> NqgetAllEmployees();
Сложная часть методов репозитория (в частности, в ситуации с PostgreSQL) — это кавычки, которые могут привести к неправильному пониманию PostgreSQL, и вместо того, чтобы перезаписывать методы, я думаю, проще написать прямой запрос.
Было бы неплохо, если бы кто-нибудь мог сказать, что лучше: методы репозитория или собственный запрос.
Подключите отладчик к своей программе, поставьте точку останова в контроллере и посмотрите, что происходит.