1. 環境(理論上不限)
- IDEA 2019.3.5
- springboot 2.3.0
- gradle 6.3
- querydsl 4.2.1
- 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工程搭建:
- 新建spring boot gradle項目(記得選JPA)
- 設置中開啓annotationProcessor和安裝lombok的IDEA 插件
- 配置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);
}
}
- 編寫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);
}
- 編寫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> {
}
- 編寫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);
}
}
- 測試
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