A predicate with a String literal {{criteriaBuilder.equal(from.get("name"), "horse");}} creates a bind parameter: {{name=:param}}. Fine!
A predicate with a numeric literal {{criteriaBuilder.equal(from.get("age"), Integer.valueOf(42));}} does *not* create a bind parameter: {{age=42}}. Not fine!
The concern here is that the fact that literals are used in the JDBC query rather than bind variables (parameters) a PreparedStatement cannot be effectively cached.
I think HHH-4698 caused this issue.
*Test Case* {code:title=Animal.java|borderStyle=solid} @Entity public class Animal { @Id Long id; String name; Integer age; } {code}
{code:title=CriteriaParameterTest.java|borderStyle=solid} @Entity @Test public void testPredicateWithString() { EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<Animal> criteriaQuery = criteriaBuilder.createQuery(Animal.class); Root<Animal> from = criteriaQuery.from(Animal.class);
Predicate namePredicate = criteriaBuilder.equal(from.get("name"), "horse");
criteriaQuery.select(from).where(namePredicate); TypedQuery<Animal> typedQuery = entityManager.createQuery(criteriaQuery);
Query query = typedQuery.unwrap(QueryImpl.class).getHibernateQuery(); System.out.println(query.getQueryString()); assertTrue(query.getQueryString().contains("name=:param")); }
@Test public void testPredicateWithInteger() { EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<Animal> criteriaQuery = criteriaBuilder.createQuery(Animal.class); Root<Animal> from = criteriaQuery.from(Animal.class);
Predicate agePredicate = criteriaBuilder.equal(from.get("age"), Integer.valueOf(42));
criteriaQuery.select(from).where(agePredicate); TypedQuery<Animal> typedQuery = entityManager.createQuery(criteriaQuery);
Query query = typedQuery.unwrap(QueryImpl.class).getHibernateQuery(); System.out.println(query.getQueryString()); assertTrue(query.getQueryString().contains("age=:param")); } } {code} |
|