06/20
2012
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를 이용한 동적 쿼리 정말 너무 간단하고 편리하다.
(아.. 물론 단점도 있다... 성능이슈, 복잡한 쿼리의 표현 등...)
높은 생상성을 위해 앞으로 자주 자용할 것 같다 ^^*