Когда вы предоставляете заполненный список, ваша вторая часть запроса ( ИЛИ: idCat IS NULL ) преобразуется в список значений для сравнения с " IS NULL ".
Как указано в JSR-338 , глава 4.6.11, " [a] нулевое выражение сравнения проверяет, является ли однозначное выражение пути или входной параметр значением NULL значение", поэтому ожидается, что он не будет поддерживать заполненный список в качестве аргумента. Для проверки списков существует выражение " IS [NOT] EMPTY ", но оно ожидает collection_valued_path_expression , и это не ваш случай.
Я наткнулся иногда со странным поведением некоторых поставщиков персистентности, где они поддерживали (anti-spe c) такое сравнение, если вы заключили параметр в круглые скобки, но, опять же, вы не можете полагаться на него для будущих изменений.
Лучшим подходом в вашем случае будет определение двух разных JPQL или методов для работы с обоими желаемыми сценариями ios.