Spring Boot操作MongoDB如何按title校验条目是否存在
适配你现有代码结构的最简实现方案
1. BookRepository.java 最小改动(零手写逻辑完成存在性校验)
- 不需要手写复杂查询逻辑,在你现有的继承
MongoRepository的接口中,直接添加符合Spring Data命名规则的派生查询方法即可,框架启动时会自动生成对应的查询实现,完全不用自己写SQL或者Criteria:public interface BookRepository extends MongoRepository<Book, String> { // 方法名严格遵循existsBy + 实体类字段名规则,自动实现按title判断条目是否存在 boolean existsByTitle(String title); } - 你之前在Controller里手动构造
Criteria拼title匹配逻辑的写法,属于把仓储层的查询逻辑写到了接口层,对于单字段校验的场景是完全的过度设计,这种单字段判断存在的需求,用上面的派生查询方法是出错最少、代码量最少的实现
2. BookController.java 两个问题的直接修正
- 删掉你之前在Controller里手写title匹配
Criteria的冗余逻辑,直接注入BookRepository后调用上面写的校验方法即可 - 修复插入返回值错赋值给Memory类型变量的问题:
bookRepository.save()方法的返回值就是持久化完成的Book对象,和Memory类型没有任何关联,把之前错误的赋值行删除,直接接收返回值做业务返回即可 - 修正后的/createBook POST接口示例代码:
@RestController public class BookController { // 注入Book仓储,不用手动初始化MongoTemplate @Autowired private BookRepository bookRepository; @PostMapping("/createBook") public ResponseEntity<String> createBook(@RequestBody Book inputBook) { // 一行代码完成title重复校验,无需拼任何查询条件 if (bookRepository.existsByTitle(inputBook.getTitle())) { return ResponseEntity.badRequest().body("同名图书已存在,无法重复创建"); } // 正确接收save的返回值,不存在跨类型赋值的问题 Book savedBook = bookRepository.save(inputBook); return ResponseEntity.ok("图书创建成功,记录ID:" + savedBook.getId()); } }
3. 现有Book.java 的补充提醒
- 你现在的实体类只写了带
creator、title的有参构造,需要补一个无参构造方法,不然Spring Data MongoDB在做对象反射映射的时候会抛出构造异常,补充的代码就是:public Book() {}
内容的提问来源于stack exchange,提问作者vasilis 123
相关产品推荐
相关产品推荐

