現在、前に JPQL 直で書いていたクエリを、
QueryDsl に書き換えるという不毛な作業をしています。
それなりの数を変換しましたので、
書き換えた JPQL を幾つか記載します。
前提
-
使用した
QueryDsl
の Version
4.1.4 です。
<!-- QueryDsl 本体 --> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-core</artifactId> <version>4.1.4</version> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> <version>4.1.4</version> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-sql</artifactId> <version>4.1.4</version> </dependency> <!-- アノテーションプロセッサー --> <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> <dependencies> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version>4.1.4</version> </dependency> </dependencies> </plugin>
-
参考サイト Querydsl Reference Guide
LIKE 文
-
JPQL
SELECT festival FROM Festival festival WHERE festival.name LIKE ?1 ESCAPE '!'
-
Expressions
を使用する。
QFestival qFestival = QFestival.festival; JPAQueryFactory queryFactory = new JPAQueryFactory(em); List<Festival> results = queryFactory .selectFrom(qFestival) .where(qFestival.name.like(Expressions.asString(name).concat("%"))).fetch();
-
startsWith
メソッドを使用する。JPAQueryFactory queryFactory = new JPAQueryFactory(em); List<Festival> results = queryFactory.selectFrom(qFestival) .where(qFestival.name.startsWith(name)).fetch();
MAX 関数
-
JPQL
SELECT max(festival.updateDate) FROM Festival festival
-
max()
メソッドで指定QFestival qFestival = QFestival.festival; JPAQueryFactory queryFactory = new JPAQueryFactory(em); return queryFactory .select(qFestival.updateDate.max()) .from(qFestival).fetchOne();
COUNT 関数
-
JPQL
SELECT count(festival) FROM Festival festival
-
count()
メソッドで指定QFestival qFestival = QFestival.festival; JPAQueryFactory queryFactory = new JPAQueryFactory(em); return queryFactory .select(qFestival.count()) .from(qFestival) .fetchOne();
DISTINCT 関数 と ORDER BY
-
JPQL
SELECT DISTINCT heldYear1.heldYear FROM HeldYear heldYear1 INNER JOIN Festival festival ON heldYear1.id = festival.heldYearId.id ORDER BY heldYear1.heldYear DESC
-
selectDistinct()
メソッド、orderBy()
メソッドでdescを指定QHeldYear qHeldYear = QHeldYear.heldYear1; QFestival qFestival = QFestival.festival; JPAQueryFactory queryFactory = new JPAQueryFactory(em); return queryFactory.selectDistinct(qHeldYear.heldYear) .from(qHeldYear) .innerJoin(qFestival).on(qHeldYear.id.eq(qFestival.heldYearId.id)) .orderBy(qHeldYear.heldYear.desc()).fetch();
DELETE文
-
JQPL
DELETE FROM lastfm_search_result WHERE (search_query_id = ?)
-
delete()
メソッドで指定QLastfmSearchResult qResult = QLastfmSearchResult.lastfmSearchResult; JPAQueryFactory queryFactory = new JPAQueryFactory(em); long updateCount = queryFactory .delete(qResult) .where(qResult.searchQueryId.eq(searchQuery)).execute();
INNER JOIN
-
JQPL
SELECT lastfmSearchResult FROM LastfmSearchResult lastfmSearchResult INNER JOIN SearchQuery searchQuery ON lastfmSearchResult.searchQueryId = searchQuery INNER JOIN FATagSQueryRelation fATagSQueryRelation ON fATagSQueryRelation.festivalArtistTagId = ?1
-
innerJoin()
メソッドを使うQLastfmSearchResult qResult = QLastfmSearchResult.lastfmSearchResult; QSearchQuery qSearch = QSearchQuery.searchQuery; QFATagSQueryRelation qRelation = QFATagSQueryRelation.fATagSQueryRelation; JPAQueryFactory qFactory = new JPAQueryFactory(em); return qFactory .selectFrom(qResult) .innerJoin(qSearch).on(qResult.searchQueryId.eq(qSearch)) .innerJoin(qRelation).on(qRelation.festivalArtistTagId.eq(fATag)) .fetch();
もっとバリエーションに富んでいるかと思いましたが、
そんなことありませんでした。
以上です。
コメント