728x90

jpa 76

@Query 와 파라미터 바인딩

리포지토리 메소드에 직접 쿼리를 정의하려면 @org.springframework.data.jpa.repository.Query 어노테이션을 사용한다. 이 방법은 실행할 메소드에 정적 쿼리를 직접 작성하므로 이름 없는 Named 쿼리라 할 수 있다. 또한 JPA Named 쿼리처럼 애플리케이션 실행 시점에 문법 오류를 발견할 수 있는 장점이 있다. public interface MemberRepository extends JpaRepository { @Query("select m from Member m where m.username = ?1") Member findByUsername(String username); } 파라미터 바인딩 스프링 데이터 JPA는 위치 기반 파라미터 바인딩과 이름 기반 파라미터..

SpringDataJPA 2022.06.21

JPA Named Query(메소드 이름으로 JPA Named 쿼리 호출)

스프링 데이터 JPA는 메소드 이름으로 JPA Named 쿼리를 호출하는 기능을 제공한다. JPA Named 쿼리의 이름 그대로 쿼리에 이름을 부여해서 사용하는 방법인데, 어노테이션이나 XML에 쿼리를 정의할 수 있다. @Entity @NamedQuery( name="Member.findByUsername", query="select m from Member m where m.username = :username") public class Member { ... } 이렇게 정의한 Named 쿼리를 JPA에서 직접 호출하려면 아래처럼 코드를 작성해야 한다. public class MemberRepository { public List findByUsername(String username){ ... Lis..

SpringDataJPA 2022.06.20

스프링 데이터 JPA 설정

필요 라이브러리 스프링 데이터 JPA는 spring-data-jpa 라이브러리가 필요하다. org.springframework.data spring-data-jpa 1.8.0.RELEASE 환경설정 스프링 설정에 XML을 사용하면 를 사용하고 리포지토리를 검색할 base-package를 적는다. 참고로 해당 패키지와 그 하위 패키지를 검색한다. 스프링 설정에 JavaConfig를 사용하면 아래와 같이 org.springframework.data.jpa.repository.config.EnableJpaRepositories 어노테이션을 추가하고 basePackages에는 리포지토리를 검색할 패키지 위치를 적는다. @Configuration @EnableJpaRepositories(basePackages =..

SpringDataJPA 2022.06.20

스프링 데이터 JPA 소개(부재 - 편리한 개발)

스프링 데이터 JPA는 스프링 프레임워크에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트 이 프로젝트는 데이터 접근 계층을 개발할 때 지루하게 반복되는 CRUD 문제를 세련된 방법으로 해결한다. 그 방법은 리포지토리를 개발할 때 인터페이스만 작성하면 실행 시점에 스프링 데이터 JPA가 구현 객체를 동적으로 생성해서 주입해준다. 따라서, 데이터 접근 계층을 개발할 때 구현 클래스 없이 인터페이스만 작성해도 개발을 완료할 수 있다. public interface MemberRepository extends JpaRepository{ Member findByUsername(String username); } public interface ItemRepository extends JpaRepositor..

SpringDataJPA 2022.06.19

벌크 연산(부제 - DB에 직접 쿼리)

엔티티를 수정하려면 영속성 컨텍스트의 변경 감지 기능이나 병합을 사용한다. 하지만 이방법으로는 수백개 이상의 엔티티를 하나씩 처리하기에는 시간이 너무 오래 걸린다. 이럴 때 여러건을 한 번에 수정하거나 삭제하는 벌크 연산을 사용하면 된다. String sqlString = "update Product p " + "setp.price = p.price * 1.1 " + "where p.stockAmount < :stockAmount"; int resultCount = em.createQuery(qlString) .setParameter("stockAmount", 10) .executeUpdate(); 벌크 연산은 executeUpdate() 메소드를 사용한다. 이 메소드는 벌크 연산으로 영향을 받은 엔티티..

JPA 2022.06.18

(QueryDSL) 동적쿼리(feat. BooleanBuilder)

com.mysema.qeury.BooleanBuilder를 사용하면 특정 조건에 따른 동적 쿼리를 편리하게 생성할 수 있다. SearchParam param = new SearchParam(); param.setName("시골개발자"); param.setPrice(10000); QItem item = QItem.item; BooleanBuilder builder = new BooleanBuilder(); if (StringUtils.hasText(param.getName())) { builder.and(item.name.contains(param.getName())); } if (param.getPrice() != null) { builder.and(item.price.gt(param.getPrice()..

QueryDSL 2022.06.18

(JPA)프로젝션 feat.QueryDSL..

select 절에 조회 대상을 지정하는 것을 프로젝션이라 한다. 프로젝션이 하나면 아래 예제와 같이 해당 타입으로 반환한다. QItem item = QItem.item; //프로젝션 대상이 하나 List result = query.from(item).list(item.name); for (String name : result) { System.out.println("name = " + name); } 반면, 프로젝션 대상으로 여러 필드를 선택하면 QueryDSL은 기본으로 com.mysema.query.Tuple이라는 Map과 비슷한 내부 타입을 사용한다. 조회 결과는 tuple.get() 메소드에 조회한 쿼리 타입을 지정하면 된다. QItem item = QItem.item; List result = ..

QueryDSL 2022.06.18

QueryDsl 조인 종류

조인(Join)은 innerJoin(join), leftJoin, rightJoin, fullJoin을 사용할 수 있다. 추가로 JPQL의 on과 성능 최적화를 위한 fetch 조인도 사용할 수 있다. 조인의 기본 문법은 첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭으로 사용할 쿼리타입을 지정한다. join(조인대상, 별칭으로 사용할 쿼리 타입) QOrder order = QOrder.order; QMember member = Qmember.member; QOrderItem orderItem = QOrderItem.orderItem; query.from(order) .join(order.member, member) .leftJoin(order.orderItems, orderItem)..

QueryDSL 2022.06.17

페이징과 정렬(feat.queryDSL)

QItem item = QItem.item; query.from(item) .where(item.price.gt(20000) .orderBy(item.price.desc(), item.stockQuantity.asc()) .offset(10).limit(20) .list(item); 정렬은 orderBy를 사용하는데 쿼리 타입(Q)이 제공하는 asc(), desc()를 사용한다. 페이징은 offset과 limit을 적절히 조합해서 사용하면 된다. 실제 페이징 처리를 하려면 검색된 전체 데이터 수를 알아야 한다. 이때는 list() 대신에 아래 예제와 같이 listResults()를 사용한다. SearchResults result = query.from(item) .where(item.price.gt(10..

QueryDSL 2022.06.17
728x90