[JPA] JPQL

Coastby·2022년 11월 7일
0

Daengnyang 프로젝트

목록 보기
2/12

JPQL (JPA Query Language)


JPQL은 JPA에서 사용할 수 있는 쿼리를 의미한다. JPQL의 문법은 SQL과 매우 비슷해서 데이터베이스 쿼리에 익숙하면 어렵지 않게 사용할 수 있다. SQL과의 차이점은 SQL에서는 테이블이나 칼럼의 이름을 사용하는 것과 달리 JPQL은 엔티티 객체를 대상으로 수행하는 쿼리이기 때문에 매핑된 엔티티의 이름과 필드의 이름을 사용한다는 것이다.

//JPQL
String query = "select p from Player as p where p.playername like '%park%'";

📎 JPQL Criteria

JPQL은 문자열이기 때문에 동적 쿼리를 작성하는 것이 어렵다. 그래서 사용하는 것이 JPQL Criteria이다.

//Criteria 사용 준비
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Player> query = cb.createQuery(Player.class);

//루트 클래스 (조회를 시작할 클래스)
Root<Player> player = query.from(Player.class);

//쿼리 생성 
CriteriaQuery<Player> cq = 
      query.select(player).where(cb.equal(player.get("playername"), “park”));
      
List<Player> resultList = em.createQuery(cq).getResultList();

그러나 가독성이 매우 떨어지므로 유지보수 시 이해하기 어렵다는 단점이 있어 JPQL Criteria는 JPA 표준 스펙 중 하나지만, 현업에서는 잘 사용하지 않는다.

📎 QueryDSL

  • JPQL의 작성을 도와주는 오픈소스 라이브러리이다.
//QueryDSL 기본 구조
private final JPAQueryFactory queryFactory;

public List<Player> findAllPlayer(Player player) {
   
   return queryFactory
               .select(player)
               .from(player)
               .where(player.name.like("park");
}

📎 Native SQL

SQL을 직접 작성하는 방식이다. JPQL로 해결할 수 없는 상황에서 사용한다. (특정 DB에 종속적인 쿼리문을 작성하거나 SQL 방언으로 커버가 불가능한 SQL을 작성하는 경우)

String sql = "SELECT * FROM PLAYER WHERE NAME = 'park'";

List<Player> result = em.createNativeQuery(sql, Player.class).getResultList();

📎 JDBC 직접 사용

Native SQL은 쿼리문을 문자열로 작성하기 때문에 문제가 발생할 가능성이 높아 현업에서는 잘 사용하지 않는다. 더불어 확장 가능성을 염두에 두면 문자열로 쿼리문을 작성하는 방식은 효율적이지 않다.

그러므로 JDBC Connection, Spring의 JdbcTemplate, MyBatis 등을 함께 사용하는 것을 권장한다.

JPA에서는 flush()를 실행해야 DB에 데이터가 들어간다. flush()는 commit 시점 또는 쿼리가 실행되는 시점에서 수행된다. 그러나 JDBC를 이용하는 경우, JPA의 기능을 사용하는 것이 아니므로 flush()가 실행되지 않느다. 그러므로 적절한 시점에 강제로 flush()를 실행해야 한다는 것을 주의해야 한다.

profile
훈이야 화이팅

0개의 댓글