18

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 インジェクションなど、このようなパラメーターを使用することの欠点はありますか?

4

3 に答える 3