QueryDsl で実装したいくつかのクエリ


現在、前に 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();
    

もっとバリエーションに富んでいるかと思いましたが、
そんなことありませんでした。

以上です。

コメント