Mongodb 모듈의 조회 기능을 설명한다.
메이븐 프로젝트에 다음 의존을 추가한다.
<dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>${querydsl.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-mongodb</artifactId> <version>${querydsl.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.1</version> </dependency>
Querydsl을 이용해서 쿼리 타입을 생성하기 위해 메이븐 APT 플러그인을 설정한다.
<project> <build> <plugins> ... <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.mysema.query.apt.morphia.MorphiaAnnotationProcessor</processor> </configuration> </execution> </executions> </plugin> ... </plugins> </build> </project>
MorphiaAnnotationProcessor는 com.google.code.morphia.annotations.Entity
애노테이션이 적용된 도메인 타입을 위한 Querydsl 쿼리 타입을 생성한다.
mvn clean install 을 실행하면 target/generated-sources/java 폴더에 쿼라 타입 코드가 생성된다.
이클립스를 사용중이면, mvn eclipse:eclipse 을 실행해서 target/generated-sources/java을 이클립스 프로젝트의 소스 폴더에 포함시킨다.
이제 쿼리 도메인 모델을 이용해서 Mongodb를 조회할 수 있다.
Querydsl Mongodb를 이용하면 다음과 같이 간단하게 쿼리할 수 있다.
Morphia morphia; Datastore datastore; // ... QUser user = new QUser("user"); MorphiaQuery<User> query = new MorphiaQuery<User>(morphia, datastore, user); List<User> list = query .where(user.firstName.eq("Bob")) .list();
MongodbQuery 클래스의 cascading 메서드는 다음과 같다.
where: 쿼리 필터를 추가한다. 가변인자나 and/or 메서드를 이용해서 필터를 추가한다. PStrings에 수행되는 오퍼레이션을 지원한다. (matches, indexOf, charAt은 제외). 현재 in은 지원되지 않으며, 향후 지원할 예정이다.
orderBy: 정렬 표현식을 이용해서 정렬 순서를 지정한다. 숫자나 문자열에 대해서는 asc()나 desc()를 사용하고, OrderSpecifier에 접근하기 위해 다른 비교 표현식을 사용한다.
limit, offset, restrict: 결과의 페이징을 설정한다. limit은 최대 결과 개수, offset은 결과의 시작 행, restrict는 limit과 offset을 함께 정의한다.
정렬 구문은 다음과 같다.
query
.where(doc.title.like("*"))
.orderBy(doc.title.asc(), doc.year.desc())
.list();
title과 year의 오름차순으로 결과를 정렬한다.
near(Double[]) 메서드를 이용해서 공간 검색을 할 수 있다.
query .where(geoEntity.location.near(50.0, 50.0)) .list();