[java] Hibernate와 동적 쿼리 생성

Hibernate는 Java 프로그램에서 객체 지향적인 데이터베이스 액세스를 제공하는 강력한 프레임워크입니다. 동적 쿼리란 런타임에 조건에 따라 쿼리를 생성하는 기술을 의미하는데, Hibernate에서 동적 쿼리를 생성하는 방법에 대해 알아보겠습니다.

Criteria API를 이용한 동적 쿼리 생성

Hibernate는 Criteria API를 통해 동적 쿼리를 생성할 수 있습니다. Criteria API는 프로그래밍 방식으로 쿼리를 작성하는 방법을 제공하며, 복잡한 쿼리도 간단하게 구성할 수 있습니다.

CriteriaBuilder cb = getSession().getCriteriaBuilder();
CriteriaQuery<Entity> cq = cb.createQuery(Entity.class);
Root<Entity> root = cq.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 + "%"));
}

cq.where(predicates.toArray(new Predicate[0]));

List<Entity> result = getSession().createQuery(cq).getResultList();

위 코드는 Criteria API를 사용하여 동적 쿼리를 생성하는 예제입니다. 조건에 따라 Predicate를 생성하여 쿼리에 추가할 수 있습니다.

HQL(Hibernate Query Language)을 이용한 동적 쿼리 생성

또 다른 방법으로는 HQL을 사용하여 동적 쿼리를 생성하는 방법이 있습니다. HQL은 객체를 대상으로 하는 SQL과 유사한 쿼리 언어로, 동적 쿼리를 쉽게 작성할 수 있습니다.

String hql = "FROM Entity WHERE 1=1";
if (condition1) {
    hql += " AND field1 = :value1";
}
if (condition2) {
    hql += " AND field2 LIKE :value2";
}

Query query = getSession().createQuery(hql);
if (condition1) {
    query.setParameter("value1", value1);
}
if (condition2) {
    query.setParameter("value2", "%" + value2 + "%");
}

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

위 코드는 HQL을 사용하여 동적 쿼리를 생성하는 예제입니다. 조건에 따라 동적으로 HQL을 구성하고, 파라미터를 바인딩하여 쿼리를 실행합니다.

결론

Hibernate를 사용하여 동적 쿼리를 생성하는 방법에 대해 살펴봤습니다. Criteria API나 HQL 중 선택하여 적합한 방법으로 동적 쿼리를 구성할 수 있으며, 각각의 장단점을 고려하여 적절한 방법을 선택해야 합니다.