用作“IN”比较的列表为空时出错

Error when list used as an `IN` comparison is empty

我有以下更新查询:

  @Transactional
  @Modifying
  @Query("UPDATE DailyEntry dailyEntry SET dailyEntry.status = :status WHERE dailyEntry.id IN :id")
  void updateDailyEntriesStatus(@Param("status") EntryStatus status, @Param("id") List<Long> id);

它工作正常,但当 :id 为空时出现错误。错误消息并没有多大帮助:

could not execute statement

我想了解为什么空列表会成为问题。如果它为空,则每个 dailyEntry.

的条件应该为假

但如果是这种情况,是否有办法防止该错误并使查询在 :id 为空时仍然有效?我也可以只检查它在我的 service 中是否为空,并且只在它不为空时调用该查询。我不确定什么是更好的方法。

IN() 期待一个表达式,就像比较运算符需要左侧和右侧都有意义一样。也就是说,

... WHERE value IN ();

有点像在说

if value = 

这不是一个完整的表达式。但是你已经有了一个很好的答案:

I could also just check whether it's empty inside my service and only call that query when its not empty. I'm not sure what's the better approach.

仅当 IN 子句不为空时才执行查询是更好的方法。正如我相信您也说过的那样,您可以在调用查询的同一函数中执行此操作;在调用查询之前只是 return 一个空结果,这样调用者就不需要担心这些细节。