[java] 자바 ORM에서의 동적 쿼리 작성 방법

자바 ORM(Object-Relational Mapping)을 사용하다 보면 때로는 동적으로 쿼리를 작성해야 하는 경우가 있습니다. 예를 들어 사용자가 지정한 조건에 따라 WHERE 절이 동적으로 변하는 쿼리를 작성해야 할 수도 있습니다. 이번 포스트에서는 자바에서 ORM을 사용할 때 동적 쿼리를 작성하는 방법에 대해 알아보겠습니다.

1. Criteria를 활용한 동적 쿼리

JPA(Java Persistence API)에서는 Criteria API를 사용하여 동적 쿼리를 작성할 수 있습니다. Criteria API는 프로그래밍 방식으로 쿼리를 작성할 수 있는 방법을 제공하여 동적인 쿼리 작성을 지원합니다.

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Entity> query = cb.createQuery(Entity.class);
Root<Entity> root = query.from(Entity.class);

List<Predicate> predicates = new ArrayList<>();

if (condition1) {
    predicates.add(cb.equal(root.get("field1"), value1));
}

if (condition2) {
    predicates.add(cb.like(root.get("field2"), "%" + value2 + "%"));
}

query.where(predicates.toArray(new Predicate[]{}));

List<Entity> resultList = entityManager.createQuery(query).getResultList();

위의 예시에서는 CriteriaBuilder를 사용하여 동적으로 Predicate를 추가하고, 이를 쿼리에 적용하는 방법을 보여줍니다.

2. JPQL을 활용한 동적 쿼리

JPQL(Java Persistence Query Language)을 사용하여 동적 쿼리를 작성할 수도 있습니다. JPQL은 엔티티 객체를 기반으로 쿼리를 작성하는 방법을 제공합니다.

String jpql = "SELECT e FROM Entity e WHERE 1 = 1";
Map<String, Object> params = new HashMap<>();

if (condition1) {
    jpql += " AND e.field1 = :value1";
    params.put("value1", value1);
}

if (condition2) {
    jpql += " AND e.field2 LIKE :value2";
    params.put("value2", "%" + value2 + "%");
}

TypedQuery<Entity> query = entityManager.createQuery(jpql, Entity.class);
for (Map.Entry<String, Object> entry : params.entrySet()) {
    query.setParameter(entry.getKey(), entry.getValue());
}

List<Entity> resultList = query.getResultList();

위의 예시에서는 JPQL을 사용하여 WHERE 절을 동적으로 조합하고, 파라미터를 바인딩하는 방법을 보여줍니다.

결론

이렇게 자바 ORM에서는 Criteria API나 JPQL을 활용하여 동적 쿼리를 작성할 수 있습니다. 필요에 따라 조건을 프로그래밍적으로 처리하여 동적으로 쿼리를 생성할 수 있으며, 이를 통해 유연한 데이터베이스 연동이 가능해집니다.

참고 문헌: