Spring Data JPA + QueryDSL實現CRUD和複雜查詢案例

banq發表於2021-04-21

Spring Data JPA僅執行CRUD操作,而對於所有複雜的查詢,使用QueryDSL。
可以使用此連結在GitHub上找到完整的專案。有一個簡單的SpringBoot應用程式,具有配置的MySQL資料來源和稱為Flyway遷移的初始資料庫結構。
引入QueryDSL:

<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.querydsl</groupId>
    <artifactId>querydsl-apt</artifactId>
</dependency>


查詢Java寫法:
public List<Author> findAllWithBooks() {
        return queryFactory
                .select(author).distinct()
                .from(author)
                .innerJoin(author.books, book).fetchJoin()
                .fetch();
 }
輸出SQL:

select distinct author0_.id as id1_0_0_, books1_.id as id1_1_1_, author0_.email as email2_0_0_, author0_.full_name as full_nam3_0_0_, books1_.author_id as author_i4_1_1_, books1_.iban as iban2_1_1_, books1_.name as name3_1_1_, books1_.author_id as author_i4_1_0__, books1_.id as id1_1_0__ from author author0_ inner join book books1_ on author0_.id=books1_.author_id


如您所見,僅執行了一個查詢。作者的所有書籍都將被載入,並且不會有其他子選擇或LazyLoadingExceptions。
distinct() 原始查詢中使用運算子從結果中刪除作者重複項。

相關文章