我正在处理连接到PostgreSQL数据库的Spring Boot应用程序。我有一个实体类播放器,并且手动将数据插入数据库。但是,当我发送get请求以检索数据时,响应是一个空的JSON数组{}。尽管如此,我可以直接使用SQL查询在数据库中看到数据。

问题描述 投票:0回答:1
package com.backend.basketMarkt.Repository; import com.backend.basketMarkt.Entity.Player; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; import java.util.Optional; @Repository public interface PlayerRepository extends JpaRepository<Player, Integer> { void deleteByPlayerName(String player); Optional<Player> findByPlayerName(String player); List<Player> findByPosition(String position); List<Player> findByPositionAndPlayerName(String position, String player); List<Player> findByTeam(String team); List<Player> findByTeamAndPlayerName(String team, String player); void deleteByPosition(String position); }

服务

package com.backend.basketMarkt.Service; import com.backend.basketMarkt.Entity.Player; import com.backend.basketMarkt.Repository.PlayerRepository; import jakarta.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.GetMapping; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @Component public class PlayerService { final private PlayerRepository playerRepository; @Autowired public PlayerService(PlayerRepository playerRepository) { this.playerRepository = playerRepository; } public List<Player> getPlayers() { List<Player> players = playerRepository.findAll(); System.out.println("Total players in DB: " + players.size()); // Debug için return players; } public Optional<Player> getPlayerByName(String player) { // repositorydeki birinci return playerRepository.findByPlayerName(player); } public List<Player> getPlayersByPosition(String position) { // repositorydeki ikinci return playerRepository.findByPosition(position); } public List<Player> getPlayersByPositionAndPlayer(String position, String player) { // repositorydeki ucuncu return playerRepository.findByPositionAndPlayerName(position, player); } public List<Player> getPlayersByTeam(String team) { // repositorydeki dorduncu return playerRepository.findByTeam(team); } public List<Player> getPlayersByTeamAndPlayer(String team, String player) { // repositorydeki besinci return playerRepository.findByTeamAndPlayerName(team, player); } public Player addPlayer(Player player) { return playerRepository.save(player); } @GetMapping("/test") public ResponseEntity<String> testEndpoint() { List<Player> players = playerRepository.findAll(); return ResponseEntity.ok("Total players in DB: " + players.size()); } public Player updatePlayer(Player player) { Optional<Player> existingPlayer = playerRepository.findByPlayerName(player.getPlayerName()); if (existingPlayer.isPresent()) { Player playerToUpdate = existingPlayer.get(); playerToUpdate.setPosition(player.getPosition()); playerToUpdate.setTeam(player.getTeam()); playerToUpdate.setAge(player.getAge()); playerRepository.save(playerToUpdate); return playerToUpdate; } return null; } @Transactional public void deleteByPlayerName(String playerName) { playerRepository.deleteByPlayerName(playerName); } @Transactional public void deleteByPosition(String position) { if (position == null || position.isEmpty()) { throw new IllegalArgumentException("Position cannot be null or empty"); } playerRepository.deleteByPosition(position); } }

Controller
package com.backend.basketMarkt.Controller;


import com.backend.basketMarkt.Entity.Player;
import com.backend.basketMarkt.Service.PlayerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping(path = "api/v1/player")
public class PlayerController {

    private final PlayerService playerService;

    @Autowired
    public PlayerController(PlayerService playerService) {
        this.playerService = playerService;
    }
    @GetMapping("/get")
    public ResponseEntity<?> getPlayers(
            @RequestParam(required = false) String playerName,
            @RequestParam(required = false) String team,
            @RequestParam(required = false) String position
    ) {if(team != null && position != null) {
        return ResponseEntity.ok(playerService.getPlayersByTeamAndPlayer(team, position));
    } else if (playerName != null) {
        return playerService.getPlayerByName(playerName)
                .map(ResponseEntity::ok)
                .orElse(ResponseEntity.notFound().build());
    } else if(position != null) {
        return ResponseEntity.ok(playerService.getPlayersByPosition(position));
    } else if (team != null) {
        return ResponseEntity.ok(playerService.getPlayersByTeam(team));
    } else {
        return ResponseEntity.ok(playerService.getPlayers());
    }
    }

    @PostMapping
    public ResponseEntity<Player> addPlayer(@RequestBody Player playerName) {
        Player newPlayer = playerService.addPlayer(playerName);
        return new ResponseEntity<>(newPlayer, HttpStatus.CREATED);
    }
    @PutMapping
    public ResponseEntity<Player> updatePlayer(@RequestBody Player playerName) {
        Player updatedPlayer = playerService.updatePlayer(playerName);
        if(updatedPlayer != null) {
            return new ResponseEntity<>(updatedPlayer, HttpStatus.OK);
        }else{
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }
    @DeleteMapping("/{playerName}")
    public ResponseEntity<String> deletePlayer(@PathVariable String playerName) {
        playerService.deleteByPlayerName(playerName);
        return new ResponseEntity<>("Player Deleted", HttpStatus.OK);
    }
    @DeleteMapping("/deleteByPosition/{position}")
    public ResponseEntity<String> deletePlayerByPosition(@PathVariable String position) {
        playerService.deleteByPosition(position);
        return new ResponseEntity<>("Player Deleted", HttpStatus.OK);
    }
}

database

-- Table: public.Player_Stats

-- DROP TABLE IF EXISTS public."Player_Stats";

CREATE TABLE IF NOT EXISTS public."Player_Stats"
(
    id integer NOT NULL DEFAULT nextval('"Player_Stats_id_seq"'::regclass),
    player character varying(100) COLLATE pg_catalog."default",
    age integer,
    team character varying(60) COLLATE pg_catalog."default",
    pos character varying(60) COLLATE pg_catalog."default",
    games_played integer,
    games_started integer,
    minutes_played real,
    field_goals real,
    field_goals_attempted real,
    field_goals_percentage real,
    three_point_fg real,
    three_point_attempted real,
    three_point_percentage real,
    two_point_fg real,
    two_point_attempted real,
    two_point_percentage real,
    effective_fg_percentage real,
    free_throws real,
    free_throws_attempted real,
    free_throw_percentage real,
    offensive_rebounds real,
    defensive_rebounds real,
    total_rebounds real,
    assists real,
    steals real,
    blocks real,
    turnovers real,
    personal_fouls real,
    points real,
    CONSTRAINT "Player_Stats_pkey" PRIMARY KEY (id)
)

TABLESPACE pg_default;

ALTER TABLE IF EXISTS public."Player_Stats"
    OWNER to postgres;

SELECT * FROM "Player_Stats";

GRANT ALL ON TABLE public."Player_Stats" TO postgres;

因此,当我使用Postman测试Get Request(/players)时,它会返回一个空的JSON数组,但是,直接使用SQL查询时,我可以在数据库中正确看到数据。


我已经验证了数据库连接,并且工作正常。
数据正确插入数据库。
Findall()方法应该返回数据,但它返回一个空数组。

为什么get请求返回空的JSON数组,即使数据库中存在数据?
	

检查Hibernate SQL输出
启用SQL查询记录以查看Hibernate的查询正在执行:

将其添加到应用程序。Properties: Spring.jpa.show-sql =true

spring.jpa.properties.hibernate.format_sql =true

在提出get请求时检查控制台日志。如果Hibernate是在查询Player_stats而不是“ Player_stats”,则意味着案例敏感性是问题。 确保启用实体扫描 这样可以确保Spring Boot将播放器识别为有效的实体。

java spring postgresql spring-boot spring-data-jpa
1个回答
0
投票
在玩家服务上更改为@Service并检查

  1. Postgresql默认情况下将无引用的表名称视为小写。您的实体被映射到“ player_stats”(带有混合情况),但是默认情况下,弹簧启动使用小写(player_stats)生成查询。


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.