JPA Criteria API を使用する場合、変数を直接使用するよりも ParameterExpression を使用する利点は何ですか? たとえば、文字列変数の名前で顧客を検索したい場合、次のように書くことができます
private List<Customer> findCustomer(String name) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Customer> criteriaQuery = cb.createQuery(Customer.class);
Root<Customer> customer = criteriaQuery.from(Customer.class);
criteriaQuery.select(customer).where(cb.equal(customer.get("name"), name));
return em.createQuery(criteriaQuery).getResultList();
}
パラメータを使用すると、次のようになります。
private List<Customer> findCustomerWithParam(String name) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Customer> criteriaQuery = cb.createQuery(Customer.class);
Root<Customer> customer = criteriaQuery.from(Customer.class);
ParameterExpression<String> nameParameter = cb.parameter(String.class, "name");
criteriaQuery.select(customer).where(cb.equal(customer.get("name"), nameParameter));
return em.createQuery(criteriaQuery).setParameter("name", name).getResultList();
}
簡潔にするために、特にクエリがオプションのパラメーターで長くなる場合は、最初の方法をお勧めします。SQL インジェクションなど、このようなパラメーターを使用することの欠点はありますか?