当'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 关键字