0
  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に対しては機能しないためです。このクエリの重複を回避するためのアイデアはありますか?

4

1 に答える 1

1

すべてのドライバーがパラメーター化された配列/コレクションを処理できるわけではないため、問題が発生する可能性があります。内容を完全に制御exceptForDocumentsできる場合は、(単純なサニタイズチェックを使用して)自分でSQLにシリアル化し、パラメーターを使用せずに条件付きで追加できます。

于 2013-01-28T15:37:18.540 に答える