目录

在 gradle 使用 spring-data-mongo 并配置 querydsl

准备工作

1.Java 版本是 1.8 2.Gradle 版本是 4.2.1 3.spring boot 版本是 1.5.7.RELEASE 4.spring-boot-starter-data-mongodb 5.创建 gradle 新项目

编辑 gradle 配置文件

1.配置 spring boot

buildscript {
    ext {
        springBootVersion = '1.5.7.RELEASE'
    }
    repositories {
        mavenCentral()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath "gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.9"
    }
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
repositories {
    mavenLocal()
    mavenCentral()
}
dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-data-mongodb')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

spring boot 已经配置好了,下面就可以配置 querydsl 了

  1. 配置 querydsl

在 build.gradle 配置文件中新增

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-data-mongodb')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    compile "com.querydsl:querydsl-mongodb" // querydsl
    compile "com.querydsl:querydsl-apt"  // querydsl
}
sourceSets {
    main {
        java {
            srcDir "$buildDir/generated/source/main"
        }
    }
}
querydsl {
    springDataMongo = true
    querydslSourcesDir = "$buildDir/generated/source/main"
}

querydsl 的 gradle配置已经完成,但是这个时候如果你使用 Qxxx 还是找不到类。需要先编译 querydsl 才可以找到类 3.执行命令

gradle build -x test 

上面的命令就是使用 gradle 编译项目,同时忽略测试

使用

注意:你的 Repository 需要基础org.springframework.data.querydsl.QueryDslPredicateExecutor这个接口。

//BookRepository.java
public interface BookRepository extends PagingAndSortingRepository<Book,
        String>, QueryDslPredicateExecutor<Book>{
    @Override
    List<Book> findAll(Predicate predicate);
}

1.在代码中使用

BooleanExpression expression = QBook.book.name.contains("Java");
List<Book> books = bookRepository.findAll(expression);

2.在 spring mvc 中使用

注意:在 spring mvc中的话你要自定义搜索需要继承org.springframework.data.querydsl.binding.QuerydslBinderCustomizer这个接口,然后使用Java8 中的默认方法重写customize 方法。

//BookRepository.java
public interface BookRepository extends PagingAndSortingRepository<Book,
        String>, QueryDslPredicateExecutor<Book>,
        QuerydslBinderCustomizer<QBook> {
    @Override
    default void customize(QuerydslBindings bindings, QBook root) {
        // 绑定 book 中的 name 字段。判断列的值是否存在 springmvc 传过来的字符串
        bindings.bind(root.name)
                .first(StringExpression::contains);
        // 排除 
        bindings.excluding(root.createAt, root.detail, root.nodes, root
                .updateAt, root.url);
    }
    @Override
    List<Book> findAll(Predicate predicate);
}
//BookCtrl.java
/**
 * @author chenzhenjia
 * @since 2017/10/17
 */
@Slf4j
@RestController
@RequestMapping("/v1/books")
public class BookCtrl {
    private final BookRepository bookRepository;

    @Autowired
    public BookCtrl(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }

    @GetMapping("/search")
    public List<Book> search(@QuerydslPredicate(root = Book.class) Predicate
                                     predicate) {
        log.info("搜索, param{}", predicate);
        return bookRepository.findAll(predicate);
    }

}