我在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函数的任何想法,因此将使用index。

最佳答案

将值传递到“ .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);

10-08 19:12