Spring Boot如何为findAll仓库方法加条件,实现用户仅看自身事件
解决方案
1. 扩展EventRepository添加用户专属事件查询方法
在EventRepository中添加根据用户过滤事件的方法,Spring Data JPA会自动生成对应的SQL查询逻辑:
public interface EventRepository extends CrudRepository<Event, Long> { // 根据User对象查询该用户的所有事件 List<Event> findByUser(User user); // 也可以直接根据用户ID查询(二选一即可) // List<Event> findByUserId(Long userId); }
2. 修改控制器方法获取当前用户的事件
把原来的eventRepository.findAll()替换为新的查询方法,传入当前登录用户的对象或ID:
@GetMapping("/day") public String calendar(@AuthenticationPrincipal UserDetails userDetails, Model model) { String email = userDetails.getUsername(); User user = userService.findUserByEmail(email); model.addAttribute("user", user); // 替换findAll()为根据用户查询事件的方法 model.addAttribute("events", eventRepository.findByUser(user)); // 如果用ID查询的方法,就写: // model.addAttribute("events", eventRepository.findByUserId(user.getId())); return "day"; }
额外说明
- 不建议直接用
user.getEvents():因为你在User类里给events设置了FetchType.LAZY懒加载,控制器方法执行时数据库事务已经结束,直接调用这个方法会抛出LazyInitializationException(懒加载初始化异常),用Repository查询的方式更稳妥。 - 两种查询方法选其一就行,
findByUser(User user)会自动通过外键user_id匹配,findByUserId(Long userId)直接用用户ID做查询条件,性能差异可以忽略。
内容的提问来源于stack exchange,提问作者Nicola Giovanni Caddeo
相关产品推荐
相关产品推荐

