Querydsl
https://querydsl.com/ QueryDsl文档
QueryDSL是基于ORM框架或SQL平台上的一个通用查询框架。借助QueryDSL可以在任何支持的ORM框架或SQL平台
上以通用API方式构建查询。 JPA是QueryDSL的主要集成技术,是JPQL和Criteria查询的代替方法。目前QueryDSL支持的平台包括 JPA,JDO,SQL,Mongodb 等等。。。
Querydsl扩展能让我们以链式方式代码编写查询方法。该扩展需要一个接口QueryDslPredicateExecutor,它定义了很 多查询方法。
接口继承了该接口,就可以使用该接口提供的各种方法了
public interface QuerydslPredicateExecutor<T>
T findOne(Predicate predicate);
Iterable<T> findAll(Predicate predicate);
long count(Predicate predicate); boolean exists(Predicate predicate);
// … more functionality omitted.
}
interface UserRepository extends CrudRepository<User, Long>, QuerydslPredicateExecutor<User> {}
引入依赖
<querydsl.version>4.4.0</querydsl.version>
<apt.version>1.1.3</apt.version>
<!‐‐ querydsl ‐‐>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl‐jpa</artifactId>
<version>${querydsl.version}</version>
</dependency>
添加maven插件
这个插件是为了让程序自动生成query type(查询实体,命名方式为:“Q”+对应实体名)。
<build>
<plugins>
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt‐maven‐plugin</artifactId>
<version>${apt.version}</version>
<dependencies>
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl‐apt</artifactId>
<version>${querydsl.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<phase>generate‐sources</phase>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated‐sources/queries</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
<logOnlyOnError>true</logOnlyOnError>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
执行mvn compile之后,可以找到该target/generated-sources/java,然后IDEA标示为源代码目录即可.
QuerydslPredicateExecutor查询结果:
/*
等于 EQ : equal .eq
不等于 NE : not equal .ne
小于 LT : less than .lt
大于 GT : greater than .gt
小于等于 LE : less than or equal .loe
大于等于 GE : greater than or equal .goe
*/
@Autowired
CustomerDslRepository repository;
@Test
public void test02(){
QCustomer qCustomer = QCustomer.customer;
Iterable<Customer> all = repository.findAll(qCustomer.id.in(1L, 5L).and(qCustomer.firstName.in("徐庶", "王五"))); System.out.println(all);
}
自定义查询结果
@Autowired
CustomerDslRepository repository;
@PersistenceContext
EntityManager em;
@Test
public void test01(){
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
QCustomer qCustomer = QCustomer.customer;
QueryResults<Tuple> tupleQueryResults = queryFactory.from(qCustomer)
.select(qCustomer.id.sum(), qCustomer.id)
.where( qCustomer.id.between(1, 2)
)
.orderBy(qCustomer.id.desc())
.groupBy(qCustomer.id)
.fetchResults();
for (Tuple result : tupleQueryResults.getResults()) {
System.out.println(result.get(qCustomer.id));
System.out.println(result.get(qCustomer.id.sum()));
}
}