美文网首页
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