我在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 :(得分:1)
当我将值传递给&#39; .in&#39;时,我不得不使用数组。谓语。试试这个:
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);