Search code examples
javaspring-boothibernaterestjpa

Empty Response in Java Spring Boot Hibernate JPA + PostgreSQL


I am new in Java and trying to create a simple web application for CRUD functions using RestfulAPI.

Employee.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;
    }

}

EmployeeRepository.java

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

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

EmployeeService.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();
    }
}

EmployeeController.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();
    }
}

When I load localhost:8080/api/Employee, it shows an empty list even though I already have data in the table Employee in the PostgreSQL database. Here is my Hibernate SQL execution:

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

Could anybody please tell me why it does not response the JSON data as expected?


Solution

  • So, in case you do not want to use findAll(), you can use @Query to directly write a proper query that I can be sure it works in PostgreSQL:

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

    The tricky part of the repository methods (in PostgreSQL situation specifically) is the quotation marks that can make PostgreSQL misunderstand and instead of overwriting the methods, I think it's easier to write the direct query.

    It would be nice if someone could tell what is better, repository methods or native query.