Я пытаюсь запустить это
@Query(value = "SELECT t.*\n" +
"FROM tlm_trade t\n" +
"left join tlm_trade_nugget n\n" +
"on t.trade_nugget_id=n.id\n" +
"where \n" +
"(year(t.created_date) in (case when ?1 is null then year(t.created_date) else ?1 end))\n" +
";", nativeQuery = true)
List<TlmTrade> findByFilter(Set<Integer> year);
;
Когда я передаю это как аргумент
[2021,2020,2019]
Получил эту ошибку вместо
SQLException: Operand should contain 1 column(s)
Есть идеи, что случилось?


case when ... end - это expression, они оценить до единственного значения.
В вашем примере вы надеетесь, что вы можете использовать case expression в качестве «динамического sql». т.е. если? 1 равно нулю, тогда вставьте термин "год (t.created_date)", но если? 1 не равно нулю, то вставьте? 1
Ты не можешь сделать это.
Было бы разумнее сделать это путем ветвления перед формированием @Query, одна ветвь для? 1 имеет значение null, а другая, которая использует? 1
Кроме того, избегайте выражений case в предложениях where, фильтры лучше выражать в двоичных терминах, например, здесь, используя круглые скобки, где это необходимо:
"where (?1 IS NULL AND year(t.created_date) = '2021' )\n"
«1, кстати, должен будет что-то равняться или быть больше чем-то и т. д.» 1 сам по себе не будет формировать условие фильтрации.