Notice
Recent Posts
Recent Comments
Link
아님말고
[JPA] QueryDSL 초기 세팅 및 예제 본문
maven 의존성 주입
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>${querydsl.version}</version>
</dependency>
plugin 추가
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
queryDsl은 entity 객체기준으로 생성한 Q타입 (query type) 객체로 연산을 하는데 Q타입 객체를 build 하는 plugin 세팅이다.
JPAAnnotationProcessor 가 target/generated-sources/java 경로에 Q타입 객체를 생성한다.
JPAQueryFactory
@Configuration
public class QuerydslConfig {
@PersistenceContext
private EntityManager entityManager;
@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
JPAQueryFactory 를 매번 생성하지 말고 싱글톤으로 설정해놓고 사용하자.
※ 회원 정보에서 email을 검색하는 예제
create table member(
id int not null auto_increment,
name varchar(255) not null,
email varchar(255) null,
primary key(id)
)
insert into member (name, email) values ('kim', 'kim@naver.com');
insert into member (name, email) values ('park', 'park@gmail.com');
insert into member (name, email) values ('lee', 'lee@gmail.com');
Member.java
@Data
@Entity
@Table(name = "member")
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private String email;
}
Build Path 에 Q파일 소스경로 추가하기
프로젝트명 > 오른쪽 마우스 Build Path > Configure Build Path > source 탭의 add folder 눌러서 target/generated-sources/java 추가
plugin 으로 추가한 JPAAnnotationProcessor 에 의해서 Entity 파일 수정할때마다 Q파일에 적용된다.
혹시나, 초기에 Q파일이 생성 안되져 있다면 아래 경로로 가서 수동 build 한다.
Run as > maven generated-sources
MemberRepositoryCustom.java
public interface MemberRepositoryCustom {
List<Member> findByNameOrEmail(String type, String keyword);
}
MemberRepositoryCustomImpl.java
public class MemberRepositoryCustomImpl implements MemberRepositoryCustom {
@Autowired
private JPAQueryFactory jpaQueryFactory;
private QMember qMember = QMember.member;
@Override
public List<Member> findByNameOrEmail(String type, String keyword) {
List<Member> content = jpaQueryFactory
.select(qMember)
.from(qMember)
.where(qMember.email.contains(keyword))
.fetch();
return content;
}
}
Q파일은 생성하는 2가지 방법 중에 static 으로 가져왔다.
QMember qMember = new QMember("m"); //생성자 방식
QMember qMember = QMember.meber; //Q파일 내부의 static 변수
MemberRepository.java
public interface MemberRepository extends JpaRepository<Member, Integer>, MemberRepositoryCustom {
}
MemberController.java
@RestController
@AllArgsConstructor
public class MemberController {
private MemberRepository memberRepository;
@GetMapping("members")
public ResponseEntity<List<Member>> selectMember(){
List<Member> list = memberRepository.findAll();
return ResponseEntity.ok(list);
}
@GetMapping("members/search")
public ResponseEntity<List<Member>> selectMemberByNameOrEmail(
@RequestParam String type,
@RequestParam String keyword){
List<Member> list = memberRepository.findByNameOrEmail(type, keyword);
return ResponseEntity.ok(list);
}
}
호출 및 결과
http://localhost:8080/members/search?type=1&keyword=gmail
[{"id":2,"name":"park","email":"park@gmail.com"},{"id":3,"name":"lee","email":"lee@gmail.com"}]
소스
'JPA' 카테고리의 다른 글
[JPA] Projection 의 다양한 방법들 (0) | 2022.09.15 |
---|---|
[JPA] QueryDSL 조회시 원하는 컬럼만 가져오기 (0) | 2022.09.14 |
[JPA] org.hibernate.hql.internal.ast.QuerySyntaxException: 엔티티명 is not mapped (0) | 2022.08.29 |
[JPA] QueryDSL + multi datasource 설정 (0) | 2022.08.17 |
[JPA] query를 작성하는 방법들 (0) | 2022.08.10 |
Comments