Sto costruendo una query usando l'API dei criteri JPA. Quando ho creato due predicati di restrizione utilizzando il metodo javax.persistence.criteria.Path#in(Collection<?>)
, la query SQL generata era leggermente diversa da quella che ho ipotizzato.Perché Hibernate inline L'elenco dei parametri integer è passato alla query dei criteri JPA?
Il primo predicato che è stato creato oltre l'attributo int
ha prodotto SQL con tutti gli elementi della raccolta parametri in linea: in (10, 20, 30)
.
Il secondo predicato che è stato creato su String
ha prodotto l'SQL parametrizzato: in (?, ?, ?)
.
Lasciami spettacolo:
Entity:
@Entity
public class A {
@Id
private Integer id;
private int intAttr;
private String stringAttr;
//getter/setters
}
Query:
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();
Log:
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]
Le mie domande:
- Perché gli elementi dell'intero elenco inline direttamente in sql e gli elementi dell'elenco di stringhe vengono gestiti come parametri di istruzione preparati?
- Questa funzione è specifica di Hibernate o è garantita da JPA?
- Dal punto di vista del DB, quale dei due deve essere preferito?
- Questa stringa int-sì-no è inlining in qualche modo correlata all'iniezione di sql?
- È in qualche modo correlato alla limitazione del numero di valori nella clausola sql nella clausola che RDMBS può elaborare?
- Come scrivere una query di criteri che gestirà l'elenco di parametri Integer nello stesso modo dell'elenco di parametri String.
Sembra davvero una domanda per i forum di Hibernate, non credi? –