이번에 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를 이용한 동적 쿼리 정말 너무 간단하고 편리하다.

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


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