origoni's Blog from Millky

origoni의 스프링 블로그 입니다.

CriteriaQuery 사용하기


이번에 HibernateTemplate을 사용하던 것을 전부 JPA 2.0의 EntityManager로 바꾸는 작업을 하고있다.

Criteria API 부분이 생각보다 바뀌는 부분이 많아서 적어보려 한다.


이전에 org.hibernate.Criteria 를 사용할때와 기본적인 개념은 차이가 없다.

하지만 표시형식이 많이 바뀌었다.


그럼 javax.persistence.criteria.CriteriaBuilder의 간단한 사용 방법을 보자.



@PersistenceContext

EntityManager entityManager;



select

뭐 그냥 간단한 예시다.

보드 글 리스트를 가지고 오는데. 페이징이 들어가고. 정렬이 들어가고 where 조건으로 별이가 작성한 글만 가지고 오도록 한다.


@Override

public List<Board> getBoardList(final int startRow, final int pageSize)

{

// CriteriaBuilder 인스턴스를 작성한다.

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();

// CriteriaQuery 인스턴스를 생성한다. Board 제네릭 형식으로...

CriteriaQuery<Board> criteriaQuery = criteriaBuilder.createQuery(Board.class);


// Root는 영속적 엔티티를 표시하는 쿼리 표현식이다. SQL의 FROM 과 유사함

Root<Board> root = criteriaQuery.from(Board.class);


// SQL의 WHERE절이다. 조건부는 CriteriaBuilder에 의해 생성

Predicate restrictions = criteriaBuilder.equal(root.get("nickName"), "별이");

criteriaQuery.where(restrictions);


// ORDER BY절. CriteriaQuery로 생성

criteriaQuery.orderBy(criteriaBuilder.desc(root.get("boardIdx")));


// 뭔가 복잡해 보여도 별거 없다. TypedQuery는 실행 결과를 리턴하는 타입이다.

TypedQuery<Board> boardListQuery = entityManager.createQuery(criteriaQuery).setFirstResult(startRow).setMaxResults(pageSize);

List<Board> boardList = boardListQuery.getResultList();


return boardList;

}


insert, update, delete

아 이건 뭐 설명이 필요없다.


@Override

@Transactional

public boolean insertBoard(Board board)

{

board.setRegDate(Calendar.getInstance().getTime());


this.entityManager.persist(board);


// TX 상황에서는 없어야겠다.

// this.entityManager.flush();

return true;

}


@Override

@Transactional

public boolean updateBoard(final Board newBoard)

{

Board board = entityManager.find(Board.class, newBoard.getBoardIdx());


board.setContent(newBoard.getContent());

board.setSubject(newBoard.getSubject());


return true;

}


@Override

@Transactional

public boolean deleteBoard(final int boardIdx, final int userIdx)

{

Board board = entityManager.find(Board.class, boardIdx);


if (board.getUserIdx() == userIdx)

{

entityManager.remove(board);

}


return true;

}


뭐 너무 간단해서 자세한 설명은 생략했다.


Criteria API를 이용한 동적 쿼리 정말 너무 간단하고 편리하다.

(아.. 물론 단점도 있다... 성능이슈, 복잡한 쿼리의 표현 등...)


높은 생상성을 위해 앞으로 자주 자용할 것 같다 ^^*


back to top