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

Posted

技术标签:

【中文标题】当\'IN list\'为空和非空列表时避免查询重复【英文标题】:Avoid query duplication when 'IN list' which empty and non empty list当'IN list'为空和非空列表时避免查询重复 【发布时间】:2013-01-28 15:31:58 【问题描述】:
  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】:

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

【讨论】:

以上是关于当'IN list'为空和非空列表时避免查询重复的主要内容,如果未能解决你的问题,请参考以下文章

如何在基于块的 API 方法中使用非空和可为空的 Objective-C 关键字

java空和非空判断

MySQL添加约束

如果值为空,如何在单个查询中更新列的值,然后使用前一个非空值进行更新[重复]

Python 空值和非空值

MyBatis-Plus使用学习