Java 避免在';在列表中';哪些是空列表和非空列表 public static final String UPDATE\u DOCUMENTS\u带有用户\u SQL=“\n”的\u TO\u DELETE\u标志\u+ “更新文档d\n”+ “SET d.indexed=:flagValue\n”+ “其中d.user\u id=:userId\n”+ “和d.to_delete=:toDelete”; 公共静态最终字符串更新\u文档\u与\u删除\u标志\u与\u用户\u与\u异常\u SQL=“\n”+ “更新文档d\n”+ “SET d.indexed=:flagValue\n”+ “其中d.user\u id=:userId\n”+ “和d.to_delete=:toDelete\n”+ “和d.id不在(:文件除外)”; public int markUserDocumentsToDeleteAsUnindexed(字符串userId,集合文档除外){ Map params=Maps.newHashMap(); 参数put(“flagValue”,false); 参数put(“userId”,userId); 参数put(“toDelete”,1); 参数put(“exceptForDocuments”,exceptForDocuments); 如果(文档除外。isEmpty()){ 返回jdbcTemplate.update(将文档更新为用户的删除标志,参数); } 否则{ 返回jdbcTemplate.update(更新\u文档\u为\u用户\u删除\u标志\u异常\u SQL,参数); } }

Java 避免在';在列表中';哪些是空列表和非空列表 public static final String UPDATE\u DOCUMENTS\u带有用户\u SQL=“\n”的\u TO\u DELETE\u标志\u+ “更新文档d\n”+ “SET d.indexed=:flagValue\n”+ “其中d.user\u id=:userId\n”+ “和d.to_delete=:toDelete”; 公共静态最终字符串更新\u文档\u与\u删除\u标志\u与\u用户\u与\u异常\u SQL=“\n”+ “更新文档d\n”+ “SET d.indexed=:flagValue\n”+ “其中d.user\u id=:userId\n”+ “和d.to_delete=:toDelete\n”+ “和d.id不在(:文件除外)”; public int markUserDocumentsToDeleteAsUnindexed(字符串userId,集合文档除外){ Map params=Maps.newHashMap(); 参数put(“flagValue”,false); 参数put(“userId”,userId); 参数put(“toDelete”,1); 参数put(“exceptForDocuments”,exceptForDocuments); 如果(文档除外。isEmpty()){ 返回jdbcTemplate.update(将文档更新为用户的删除标志,参数); } 否则{ 返回jdbcTemplate.update(更新\u文档\u为\u用户\u删除\u标志\u异常\u SQL,参数); } },java,sql,jdbc,jdbctemplate,Java,Sql,Jdbc,Jdbctemplate,有没有一种方法可以使用一个查询来执行两个更新 因为实际使用UPDATE\u DOCUMENTS\u WITH\u TO\u DELETE\u FLAG\u FOR\u USER\u WITH\u EXCEPTIONS\u SQL查询似乎对H2有效,但对MySQL无效。 有没有办法避免这种查询重复?问题可能是因为不是每个驱动程序都能处理参数化数组/集合。如果您完全控制exceptForDocuments内容,您可以自己将其序列化为SQL(通过简单的清理检查),然后有条件地附加它,而不使用参数

有没有一种方法可以使用一个查询来执行两个更新

因为实际使用
UPDATE\u DOCUMENTS\u WITH\u TO\u DELETE\u FLAG\u FOR\u USER\u WITH\u EXCEPTIONS\u SQL
查询似乎对H2有效,但对MySQL无效。
有没有办法避免这种查询重复?

问题可能是因为不是每个驱动程序都能处理参数化数组/集合。如果您完全控制
exceptForDocuments
内容,您可以自己将其序列化为SQL(通过简单的清理检查),然后有条件地附加它,而不使用参数

  public static final String UPDATE_DOCUMENTS_WITH_TO_DELETE_FLAG_FOR_USER_SQL = "\n" +
          "UPDATE document d \n" +
          "SET d.indexed = :flagValue \n" +
          "WHERE d.user_id = :userId \n" +
          "AND d.to_delete = :toDelete";

  public static final String UPDATE_DOCUMENTS_WITH_TO_DELETE_FLAG_FOR_USER_WITH_EXCEPTIONS_SQL = "\n" +
          "UPDATE document d \n" +
          "SET d.indexed = :flagValue \n" +
          "WHERE d.user_id = :userId \n" +
          "AND d.to_delete = :toDelete \n" +
          "AND d.id NOT IN (:exceptForDocuments)";


  public int markUserDocumentsToDeleteAsUnindexed(String userId,Collection<String> exceptForDocuments) {
    Map<String,Object> params = Maps.newHashMap();
    params.put("flagValue",false);
    params.put("userId",userId);
    params.put("toDelete",1);
    params.put("exceptForDocuments",exceptForDocuments);
    if ( exceptForDocuments.isEmpty() ) {
      return jdbcTemplate.update(UPDATE_DOCUMENTS_WITH_TO_DELETE_FLAG_FOR_USER_SQL, params);
    }
    else {
      return jdbcTemplate.update(UPDATE_DOCUMENTS_WITH_TO_DELETE_FLAG_FOR_USER_WITH_EXCEPTIONS_SQL,params);
    }
  }