当'IN list'为空和非空列表时,避免查询重复

时间:2013-01-28 15:31:59

标签: java sql jdbc jdbctemplate

  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);
    }
  }

有没有办法使用单个查询来执行这两个更新?

因为实际使用UPDATE_DOCUMENTS_WITH_TO_DELETE_FLAG_FOR_USER_WITH_EXCEPTIONS_SQL查询似乎对H2有效,但对MySQL不起作用。 有没有想过避免这种查询重复?

1 个答案:

答案 0 :(得分:1)

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