为什么休眠内联整数参数列表传递给 JPA 条件查询?
我正在使用JPA Criteria API构建一个查询。当我使用方法创建两个限制谓词时,生成的SQL查询与我执行的略有不同。javax.persistence.criteria.Path#in(Collection<?>)
第一个谓词是在属性上构建的,它生成了 SQL,其中内联了参数集合的所有元素:。int
in (10, 20, 30)
第二个谓词是在属性上构建的,它生成了参数化的 SQL: 。String
in (?, ?, ?)
让我来演示一下:
实体:
@Entity
public class A {
@Id
private Integer id;
private int intAttr;
private String stringAttr;
//getter/setters
}
查询:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<A> q = cb.createQuery(A.class);
Root<A> root = q.from(A.class);
q.where(
root.get("intAttr").in(Arrays.asList(10, 20, 30)),
root.get("stringAttr").in(Arrays.asList("a", "b", "c"))
);
entityManager.createQuery(q).getResultList();
日志:
select
a0_.id as id1_0_,
a0_.intAttr as intAttr2_0_,
a0_.stringAttr as stringAt3_0_
from
A a0_
where
(
a0_.intAttr in (
10 , 20 , 30
)
)
and (
a0_.stringAttr in (
? , ? , ?
)
)
org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - [a]
org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [2] as [VARCHAR] - [b]
org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [3] as [VARCHAR] - [c]
我的问题:
- 为什么整数列表的元素直接内联到 sql,而字符串列表的元素作为预准备语句参数进行处理?
- 此功能是特定于休眠的还是由 JPA 保证的?
- 从数据库的角度来看,两者中哪一个应该更可取?
- 这种 int-yes string-no 内联是否以某种方式与 sql 注入相关?
- 这是否与 RDMBS 可以处理的 sql IN 子句中值数量的限制有关?
- 如何编写条件查询,该查询将以与字符串参数列表相同的方式处理整数参数列表。