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);
}
}
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将播放器识别为有效的实体。
Postgresql默认情况下将无引用的表名称视为小写。您的实体被映射到“ player_stats”(带有混合情况),但是默认情况下,弹簧启动使用小写(player_stats)生成查询。