美文网首页
QueryDSL 的JPAQueryFactory 和 SQLQ

QueryDSL 的JPAQueryFactory 和 SQLQ

作者: 田文健 | 来源:发表于2019-03-23 09:03 被阅读0次

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 的时候这些需要手动创建。

相关文章

网友评论

      本文标题:QueryDSL 的JPAQueryFactory 和 SQLQ

      本文链接:https://www.haomeiwen.com/subject/xcejvqtx.html