Хотя оператор IN
поддерживает сравнение с результатами подзапроса, то, что вы делаете, не может работать (и я удивлен, что вы получили хотя бы один результат). Прежде чем идти дальше, позвольте мне процитировать спецификацию JPA 2.0:
4.6.9 В выражениях
Синтаксис использования оператора сравнения [NOT] IN в условном выражении следующий:
in_expression ::=
{state_field_path_expression | type_discriminator} [NOT] IN
{ ( in_item {, in_item}* ) | (subquery) | collection_valued_input_parameter }
in_item ::= literal | single_valued_input_parameter
state_field_path_expression должен иметь строковое, числовое значение, дату, время, временную метку или перечисляемое значение.
Значения литерала и/или входного параметра должны быть похожи на тот же тип абстрактной схемы, что и state_field_path_expression по типу. (См. Раздел 4.12).
Результаты подзапроса должны быть подобны тому же типу абстрактной схемы, что и state_field_path_expression по типу. Подзапросы обсуждаются в разделе 4.6.16.
Примеры:
o.country IN (’UK’, ’US’, ’France’)
истинно для UK
и ложно для Peru
и эквивалентно выражению (o.country = ’UK’) OR (o.country =
’US’) OR (o.country = ’ France’)
.
o.country NOT IN (’UK’, ’US’,
’France’)
является ложным для UK
и истинным для Peru
и эквивалентно выражению NOT ((o.country = ’UK’) OR
(o.country = ’US’) OR (o.country =
’France’))
.
В списке, разделенном запятыми, должен быть хотя бы один элемент, определяющий набор значений для выражения IN
.
Если значение state_field_path_expression или in_item в выражении IN или NOT IN равно NULL
или неизвестно, значение выражения неизвестно.
Обратите внимание, что использование входного параметра со значением коллекции будет означать, что статический запрос не может быть предварительно скомпилирован.
Итак, во-первых, p.id
не соответствует возвращаемому типу подвыборки (что на самом деле является «незначительной» проблемой).
Во-вторых, и это серьезная проблема и недоразумение, ваш запрос не приведет к чему-то подобному (с использованием «псевдокода»):
p.id IN (1, 2, 3)
это то, что вы хотели бы, но в
p.id IN (’1,2,3’)
что, очевидно, не то, что вы хотите, и не будет работать.
Мой единственный совет: нормализуйте свою базу данных.
person
Pascal Thivent
schedule
21.10.2010
u.group
должен возвращать1,2,3
. Тогда запрос должен бытьselect p from Profile p where p.id in (1,2,3)
... Который, в свою очередь, должен возвращать несколько результатов. - person Mads610   schedule 21.10.2010