QueryDSL 提供了JPAQueryFactory 和 SQLQueryFactory用来操作数据库。JPAQueryFactory 依赖于JPA,必须要有类似hibernate这种实现了JPA的ORM框架,使用起来比较方便,配置JPAQueryFactory :
@Bean
@Autowired
public JPAQueryFactory jpaQuery(EntityManager entityManager) {
return new JPAQueryFactory(entityManager);
}
查询
DateExpression<Date> dateExpression = SQLExpressions.date(mileage.startTime);
List<Tuple> tuples = queryFactory.select(
mileage.mileage.sum().as("mileage")
, mileage.speed.max().as("speed")
, dateExpression.as("d")
)
.from(mileage)
.where(predicate)
.groupBy(dateExpression)
.orderBy(new OrderSpecifier<>(Order.ASC, dateExpression))
.limit(pageable.getPageSize())
.offset(pageable.getOffset())
.fetch();
当然使用jpa可能有些限制,比如JPAQueryFactory 里的from字句使用子查询就不太好用。这个时候可以使用SQLQueryFactory。配置SQLQueryFactory;
@Bean
public SQLQueryFactory sqlQueryFactory(DataSource dataSource){
return new SQLQueryFactory(new com.querydsl.sql.Configuration(SQLTemplates.DEFAULT), dataSource);
}
做一些查询:
StringExpression path = Expressions.stringPath("t_bat_mileage").as("batMileage");
StringTemplate template = Expressions.stringTemplate("date(start_time)");
Long total = sqlQueryFactory.select().from(
SQLExpressions.select(template).from(path).groupBy(template), Expressions.stringPath("xx")
).fetchCount();
要注意的是使用JPAQueryFactory 时的表、字段表达式是用querydsl的maven插件自动生成的以Q开头的类型,在使用SQLQueryFactory 的时候这些需要手动创建。
网友评论