Spring boot JPA+Gradle+QueryDSL 完美配置生成Q文件依賴

1. 環境(理論上不限)

  1. IDEA 2019.3.5
  2. springboot 2.3.0
  3. gradle 6.3
  4. querydsl 4.2.1
  5. JDK 1.8

2. 核心配置(build.gradle )

buildscript {
    ext {
        queryDslVersion = '4.2.1'
        lombokVersion = '1.18.12'
    }
    repositories {
        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
    }
}

dependencies {

    // QueryDSL
    implementation("com.querydsl:querydsl-core:${queryDslVersion}")
    implementation("com.querydsl:querydsl-jpa:${queryDslVersion}")
    //關鍵地方(記得開啓annotationProcessor)
    annotationProcessor("com.querydsl:querydsl-apt:${queryDslVersion}:jpa",
            "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final",
            "javax.annotation:javax.annotation-api:1.3.2",
            "org.projectlombok:lombok")

    // Lombok(記得安裝IDEA插件)
    compileOnly "org.projectlombok:lombok:${lombokVersion}"
    annotationProcessor "org.projectlombok:lombok:${lombokVersion}"
    implementation("org.projectlombok:lombok:${lombokVersion}")
}

至此,配置已經完成,IDEA已經可以正確生成Q文件,且編譯時自動引用,不用像其他的教程還要配置七七八八的src source目錄,java編譯指令等

看到這,如果你懂,那就應該解決了,下面是demo工程搭建:

  1. 新建spring boot gradle項目(記得選JPA)
    在這裏插入圖片描述
  2. 設置中開啓annotationProcessor和安裝lombok的IDEA 插件
    在這裏插入圖片描述
  3. 配置JPAQueryFactory
package com.example.querydsldemo;

import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import javax.persistence.EntityManager;

@SpringBootApplication
public class QuerydsldemoApplication {

   public static void main(String[] args) {
       SpringApplication.run(QuerydsldemoApplication.class, args);
   }

   //讓Spring管理JPAQueryFactory
   @Bean
   public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) {
       return new JPAQueryFactory(entityManager);
   }
}

  1. 編寫Entity
package com.example.querydsldemo.entity;

import lombok.Data;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Data
@Entity
public class UserEntity {

    @Id
    @GeneratedValue(generator = "idGenerator")
    @GenericGenerator(name = "idGenerator", strategy = "native")
    private Long id;

    private String userName;

}

build一下項目(ctrl+F9),查看build目錄已經正確生成Q文件
在這裏插入圖片描述
5. 編寫Service

package com.example.querydsldemo.service;

import com.example.querydsldemo.entity.UserEntity;

public interface UserService {

    UserEntity save(UserEntity userEntity);

    UserEntity findByUserName(String userName);

    void deleteById(Long id);
}

  1. 編寫Repository
package com.example.querydsldemo.service.repository;

import com.example.querydsldemo.entity.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;

public interface UserRepository extends JpaRepository<UserEntity,Long>, QuerydslPredicateExecutor<UserEntity> {

}

  1. 編寫ServiceImpl
package com.example.querydsldemo.service.impl;

import com.example.querydsldemo.entity.QUserEntity;
import com.example.querydsldemo.entity.UserEntity;
import com.example.querydsldemo.service.UserService;
import com.example.querydsldemo.service.repository.UserRepository;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

    private final JPAQueryFactory jpaQueryFactory;

    private final UserRepository userRepository;

    public UserServiceImpl(JPAQueryFactory jpaQueryFactory, UserRepository userRepository) {
        this.jpaQueryFactory = jpaQueryFactory;
        this.userRepository = userRepository;
    }

    @Override
    public UserEntity save(UserEntity userEntity) {
        return userRepository.saveAndFlush(userEntity);
    }

    @Override
    public UserEntity findByUserName(String userName) {
        QUserEntity qUserEntity = QUserEntity.userEntity;
        return jpaQueryFactory.select(qUserEntity).from(qUserEntity).where(qUserEntity.userName.eq(userName)).fetchFirst();
    }

    @Override
    public void deleteById(Long id) {
        userRepository.deleteById(id);
    }
}

  1. 測試
package com.example.querydsldemo;

import com.example.querydsldemo.entity.UserEntity;
import com.example.querydsldemo.service.UserService;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Before;
import org.assertj.core.api.Assert;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class QuerydsldemoApplicationTests {

    @Autowired
    private UserService userService;

    @Test
    void contextLoads() {
        UserEntity userEntity = new UserEntity();
        userEntity.setUserName("張三");
        UserEntity saveEntity = userService.save(userEntity);
        UserEntity queryEntity = userService.findByUserName(saveEntity.getUserName());
        assert queryEntity != null;
        userService.deleteById(queryEntity.getId());
        queryEntity = userService.findByUserName(saveEntity.getUserName());
        assert queryEntity == null;
    }
}

完成!

demo地址:https://gitee.com/megoc/SpringBoot-Gradle-JAP-QueryDSL-Demo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章