21.JPQL

강재영's avatar
Aug 21, 2024
21.JPQL

JPQL (Java Persistence Query Language)

  • JPQL은 JPA에서 제공하는 객체지향 쿼리 언어로, SQL과 유사하지만 데이터베이스 테이블이 아닌 엔티티 객체를 대상으로 쿼리를 작성합니다.
  • JPQL은 SQL과 다르게 자바 엔티티 클래스 및 그 필드에 대해 쿼리를 작성합니다. 즉, 데이터베이스의 테이블이나 컬럼 이름 대신 자바의 엔티티 이름과 그 속성(필드) 이름을 사용합니다.
 

1.Native (jpql을 사용하지 않는다면)

public Board findByIdV2(int id) { Query query = em.createNativeQuery("select bt.id, bt.title, bt.content, bt.user_id, bt.created_at, ut.id u_id, ut.username, ut.password, ut.email, ut.created_at u_created_at from board_tb bt inner join user_tb ut on bt.user_id = ut.id where bt.id = ?"); query.setParameter(1, id); Object[] obs = (Object[]) query.getSingleResult(); System.out.println(obs[0]); System.out.println(obs[1]); System.out.println(obs[2]); System.out.println(obs[3]); System.out.println(obs[4]); System.out.println(obs[5]); System.out.println(obs[6]); System.out.println(obs[7]); System.out.println(obs[8]); System.out.println(obs[9]); // 1 // 제목1 // 내용1 // 1 // 2024-08-21 12:49:35.197432 // 1 // ssar // 1234 // ssar@nate.com // 2024-08-21 12:49:35.194432 Board board = new Board(); User user = new User(); board.setId((Integer) obs[0]); board.setTitle((String) obs[1]); board.setContent((String) obs[2]); board.setCreatedAt((Timestamp) obs[4]); user.setId((Integer) obs[3]); user.setUsername((String) obs[6]); user.setPassword((String) obs[7]); user.setEmail((String) obs[8]); user.setCreatedAt((Timestamp) obs[9]); board.setUser(user); return board; }
 
위처럼 Board Entity클래스에 User를 한번에 가져오기 위해서는 하나하나 매핑을 해줘야한다.
또한
select bt.id, bt.title, bt.content, bt.user_id, bt.created_at
, ut.id u_id, ut.username, ut.password, ut.email, ut.created_at
위와 같이 겹치는 칼럼명을 별칭(alias)을 사용해서 하나하나 바꿔야 하는 번거로움이 존재한다.
하지만 jpql을 사용한다면
 

2.JPQL을 사용한 코드

public Board findById(int id) { Query query = em.createQuery("select b from Board b join fetch b.user where b.id = :id", Board.class); query.setParameter("id", id); try { Board board = (Board) query.getSingleResult(); System.out.println("----------"); System.out.println(board); return board; } catch (Exception e) { e.printStackTrace(); //익세션을 내가 잡은것 까지 배움 - 처리 방법은 v2에서 배우기 throw new RuntimeException("게시글 id를 찾을 수 없습니다."); } }
예외처리를 제외한다면 확줄어든 모습을 볼 수 있다.
또한 자동으로 entity객체에 매핑을 하는 모습을 볼 수 있다.
 
Share article

강재영 블로그