【发布时间】:2014-12-10 19:27:28
【问题描述】:
我在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 函数,因此将使用索引。
【问题讨论】:
-
首先,任何超过 constant 的函数都是没有害处的。仅当应用于索引列时,才会使用索引。
-
是的,问题是未使用索引并且查询运行时间很长。
-
您是否尝试在 IN 列表中仅使用一个值?
标签: java spring oracle jakarta-ee jpa