2014-10-15 4 views
0

У меня есть именованный параметр в JPA типизированном запросе. Я устанавливаю список значений в состоянии.JPA Типовой параметр набора запросов

Я устанавливаю список целых чисел, но когда JPA преобразует типизированный запрос в соответствующий sql-запрос, он добавляет функцию to_number и индекс таблицы не используется.

List<Integer> studentIds=ArrayList<Integer> 
//Student id is number in database and indexed.  
query = "SELECT T.* FROM STUDENT WHERE STUDENT_ID IN (:studentIds)" 
TypedQuery<Object[]> typedQuery = entityManager().createQuery(query, Object[].class); 
typedQuery.setParameter("studentIds", studentIds); 

Вопрос в том, когда JPA генерирует запрос он добавляет to_number функции для преобразования списка по

SELECT * from student t4 where student_id in (?,?,?); 
filter("T4"."student_id"=TO_NUMBER(:9) OR "T4"."student_id"=TO_NUMBER(:10) OR 
    "T4"."student_id"=TO_NUMBER(:11) OR "T4"."PRODUCT_SET_ID"=student_id(:12) 

Есть мысли, как убедиться, что JPA не добавляет функцию to_number, поэтому будет использоваться индекс ,

+0

Прежде всего любая функция над * константой * не вредит. Только при применении по индексированному столбцу индекс не будет использоваться. –

+0

Да, проблема в том, что индекс не используется, а запрос работает долго. – Hari

+0

Вы пробовали только одно значение в списке IN? –

ответ

1

Мне пришлось использовать массив, когда я передавал значения в предикат «.in». Попробуйте следующее:

List<Integer> studentIds=ArrayList<Integer> 
Integer[] ids = new Integer[studentIds.size()]; 
ids = studentIds.toArray(ids); 
//Student id is number in database and indexed.  
query = "SELECT T.* FROM STUDENT WHERE STUDENT_ID IN (:studentIds)" 
TypedQuery<Object[]> typedQuery = entityManager().createQuery(query, Object[].class); 
typedQuery.setParameter("studentIds", ids); 
Смежные вопросы