如何用Spring Data MongoDB实现存在则删文档后插入新数据
解决方案
问题根源分析
当前代码存在多个关键问题导致插入失败:
- SQL语句语法错误:
SELECT * FROM ORGANISATIONS缺少闭合引号,会直接导致数据库查询失败 - ResultSet遍历逻辑错误:Java的
ResultSet没有length属性,原遍历方式不会执行循环体,自然没有数据插入 - 方法调用错误:用
Facility.setXXX直接调用实例方法,会触发编译报错,根本无法执行插入逻辑 - 缺失MongoDB预删除步骤:没有先清除目标设施的旧数据,同时旧的语法错误导致新数据根本没被插入
修正后的完整代码
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import java.sql.ResultSet; import java.sql.Statement; // 1. 先删除MongoDB中所有关联目标设施名称的文档 Query deleteQuery = new Query(Criteria.where("facilityName").is(basename)); mongoTemplate.remove(deleteQuery, Facility.class); // 2. 从SQL数据库读取新的设施数据 Statement orgStmt = conn.createStatement(); // 修复SQL语句的引号问题 ResultSet result = orgStmt.executeQuery("SELECT * FROM ORGANISATIONS"); // 正确遍历ResultSet(JDBC标准方式) while (result.next()) { Facility facility = new Facility(); // 使用实例调用setter方法,而非类名 facility.setFacilityId(result.getString(1)); facility.setFacilityCode(result.getString(2)); facility.setFacilityName(basename); // 插入新记录:设施不存在时自动创建新文档,存在时覆盖 visitList.save(facility); } // 关闭数据库资源 result.close(); orgStmt.close(); conn.close(); // 记得关闭SQL数据库连接
关键说明
- 预删除逻辑:通过
MongoTemplate构建删除查询,根据facilityName清除所有旧文档,确保插入的是最新数据 - ResultSet遍历:
result.next()是JDBC标准的结果集遍历方式,会逐行读取查询结果 - 实体操作修正:必须通过
Facility的实例调用setter方法,类名直接调用属于语法错误 - save方法特性:Spring Data MongoDB的
save方法会自动判断实体状态:无匹配_id时插入新文档,有匹配时更新,无需担心设施名称是否已存在
内容的提问来源于stack exchange,提问作者Janeth Jackson
相关产品推荐
相关产品推荐

