java - JpaRepository findAll 返回空列表
问题描述
findAll()
方法 fromJpaRepository
返回空值,但空值的数量正确
我正在使用 h2 数据库,直到某个未知的时刻,一切都运行良好。简单 GET athttp://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
注释,它似乎没有做任何事情。
如果我通过 仅添加一个用户,我从 Postman 获得的输出是 [{}] createNewuser()
,如果我添加了两个用户,则为 [{},{}],依此类推。我不明白是什么破坏了findAll()
方法。
PSupdateBalance()
也不起作用,但那是其他时间。
编辑:您要求的一些 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);
}
在我实施更新查询之后,我的问题首先出现(或者我认为),但我尝试运行一个我知道它在另一台计算机上工作的版本,但它没有工作。
解决方案
问题是您的属性是不可变的。您已经公开了 getter 和 setter,但您没有指定访问级别,并且默认情况下它们不是公共的,因此 hibernate 无法看到它们,因此无法使用从数据库返回的记录填充您的实体。将它们公开应该可以解决问题。
推荐阅读
- java - 选项卡布局的选项卡不显示任何内容
- excel - Excel - 计算前 5 个实例的平均值
- rest - 如何让 SimpleKPI KPI Entries API 返回数据?
- matlab - Matlab:在线性数组中查找最大 YData
- hyperledger-fabric - 身份分类失败:无法从对等身份中提取 msp.Identity
- ios - 如何在 iOS 中获得 C 函数崩溃?
- android - 当应用程序处于后台或关闭时,Android 应用程序中的本地通知不显示
- c# - 基于另一个属性连接一个属性的值
- javascript - Swiper 使用 Edge 和 Safari 在网格内溢出
- javascript - 如何更改 webpack 模块导出需要字符串?