【问题标题】:JPA Typed query set parameterJPA 类型化查询集参数
【发布时间】: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


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2016-09-13
    • 2021-09-15
    • 2018-05-08
    • 2023-03-09
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多