JpaRepository findAll возвращает пустой список - PullRequest
1 голос
/ 30 мая 2019

findAll() метод из JpaRepository возвращает пустое значение, но правильное количество пустых значений

Я использую базу данных h2, и все работало нормально до некоторого неизвестного момента.Simple GET на http://localhost:8080/users возвращает {} x количество пользователей, ранее добавленных в базу данных.Я попытался реализовать метод, который возвращал бы id, основанный на имени пользователя, и это прекрасно работает.

Вот мой User.java:

@Entity
@Table(name = "Users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "username")
    @NotBlank(message = "Username is mandatory")
    @Size(min = 1, max = 20, message = "Username must be less than 20 characters long")
    private String username;
    @Column(name = "balance")
    private Double balance = 0.0;

    Long getId() {
        return id;
    }

    void setId(Long id) {
        this.id = id;
    }

    String getUsername() {
        return username;
    }

    void setUsername(String username) {
        this.username = username;
    }

    Double getBalance() {
        return balance;
    }

    void setBalance(Double balance) {
        this.balance = balance;
    }
}

Вот UserService, который реализует методы из IUserService:

@Service
public class UserService implements IUserService {

    @Autowired
    private UserRepository repository;

    @Override
    public void createNewUser(User user) {
        repository.save(user);
    }

    @Override
    public List<User> findAll() {
        return repository.findAll();
    }

    @Override
    public Long findByUsername(String username) {
        return repository.findByUsername(username);
    }

    @Override
    public User findById(Long id) {
        return repository.findById(id).orElse(null);
    }

    @Override
    public boolean checkIfUsernameIsTaken(User user) {
        return repository.findByUsername(user.getUsername()) != null;
    }

    @Override
    public void deleteUser(Long id) {
        repository.deleteById(id);
    }

    @Override
    public void updateBalance(Long id, Double balance) {
        repository.updateBalance(id, balance);
    }
}

Я пробовал с аннотациями @Column и без них, и, похоже, он ничего не делает.

Вывод, полученный от Почтальона, будет [{}], если ядобавил только одного пользователя через createNewuser(), [{}, {}], если я добавил двух пользователей и так далее.Я не понимаю, что сломало метод findAll().

PS updateBalance() тоже не работает, но это уже в другой раз.

Редактировать: какой-то ov, который вы просили UserController:

@RestController
public class UserController {

    @Autowired
    IUserService userService;

    @GetMapping("/users")
    public List<User> findUsers() {
        return userService.findAll();
    }

    @GetMapping("/users/{id}")
    public User findUserById(@PathVariable Long id) {
        return userService.findById(id);
    }

    @PostMapping("/users")
    public ResponseEntity<Object> createUser(@RequestBody User user) {

        if (userService.checkIfUsernameIsTaken(user)) {

            Map<String, Object> response = new HashMap<>();
            response.put("status", HttpStatus.NOT_ACCEPTABLE);
            response.put("errors", "Username is already taken");
            response.put("timestamp", new Date());

            return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
        } else {
            userService.createNewUser(user);
            User currentUser = userService.findById(userService.findByUsername(user.getUsername()));
            Map<String, Object> response = new HashMap<>();
            response.put("id", currentUser.getId());
            response.put("username", currentUser.getUsername());
            response.put("balance", currentUser.getBalance());
            return new ResponseEntity<>(response, HttpStatus.OK);
        }
    }

    @DeleteMapping("/users/{id}")
    public void deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
    }

    @PutMapping("/users/{id}/{balance}")
    public void updateBalance(@PathVariable Long id, @PathVariable Double balance) {
        userService.updateBalance(id, balance);
    }
}

и UserRepository:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    @Query("SELECT id FROM User WHERE username = ?1")
    Long findByUsername(String username);

    @Transactional
    @Modifying
    @Query("UPDATE User SET balance = ?2 WHERE id = ?1")
    void updateBalance(Long id, Double balance);
}

Мои проблемы впервые появились (или я так думаю) после того, как я выполнил запрос на обновление, но я попытался запустить версию, гдеЯ знаю, что он работал на другом компьютере, но он не работал.

1 Ответ

1 голос
/ 30 мая 2019

Проблема в том, что ваши свойства не являются изменяемыми .Вы выставили геттеры и сеттеры, но не указали уровень доступа, и они не являются публичными по умолчанию, поэтому hibernate не может их видеть и, следовательно, не может заполнить вашу сущность записью, возвращенной из базы данных.Сделав их публичными , следует решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...