昨天写 JPA的查询方式,里面关于QueryDSL的部分没有写,当时因为一直报错,现在错误解决了,补上 Spring Data JPA 通过 Query DSL 查询的实现。
另2篇地址:
Spring Data JPA 的查询方式
You need to run build with JDK or have tools.jar on the classpath
pom
<dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-apt</artifactId> </dependency> <dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> </dependency> <dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <version>1.7</version> <scope>system</scope> <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath> </dependency>
官网和一些其他示例并没有提及tools,但没有这个会报错的,IDE里面就报了。
除了上面的配置还要添加构建插件
<build> <plugins> <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> </plugin> </plugins> </build>
配置完这些之后 Dao需要多继承一个接口QueryDslPredicateExecutor
package com.school1024.spring.boot.data.jpa.dao; import java.util.List; import java.util.Map; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.data.querydsl.QueryDslPredicateExecutor; import org.springframework.data.repository.query.Param; import com.school1024.spring.boot.data.jpa.model.BookModel; import com.school1024.spring.boot.data.jpa.model.type.GenderType; public interface BookDao extends JpaRepository<BookModel, Integer>, JpaSpecificationExecutor<BookModel>, QueryDslPredicateExecutor<BookModel> { }
这个接口里的方法可以接收 com.querydsl.core.types.Predicate 类型的参数,注意这个类型是querydsl的,与 javax.persistence.criteria.Predicate 是有区别的。
测试用例
@Test public void test9() { QBookModel qbook = QBookModel.bookModel; com.querydsl.core.types.Predicate predicate = qbook.gender.eq(GenderType.MALE).and(qbook.name.like("%张三%")); Iterable<BookModel> rs = dao.findAll(predicate); for (BookModel bookModel : rs) { System.out.println(bookModel); } }
输出结果:BookModel [id=1, name=张三疯自传, author=张三, gender=MALE]
测试数据参考:http://www.school1024.com/spring/spring-data-jpa-query-example.html
更多Querydsl用法参考:http://www.querydsl.com/