Rob*_* M. 4 java oracle querydsl mysema
我有以下SQL查询按一天中的订单日期和小时对订单进行分组:
select to_char(o.order_date, 'YYYY-MM-DD HH24') order_date_hour,
sum(o.quantity) quantity
from orders o
where o.order_date >= to_date('01.02.2016', 'DD.MM.YYYY')
and o.order_date < to_date('03.02.2016', 'DD.MM.YYYY')
group by to_char(o.order_date, 'YYYY-MM-DD HH24')
order by to_char(o.order_date, 'YYYY-MM-DD HH24');
Run Code Online (Sandbox Code Playgroud)
结果的一个例子如下:
ORDER_DATE_HOUR | QUANTITY
2016-02-01 06 | 10
2016-02-03 09 | 20
Run Code Online (Sandbox Code Playgroud)
查询使用SQL开发人员按预期工作.在QueryDSL中,我提出了以下查询:
SQLQuery q = queryFactory.createSQLQuery();
q.from(order);
q.where(order.orderDate.goe(Timestamp.valueOf(from)))
.where(order.orderDate.lt(Timestamp.valueOf(to)));
q.groupBy(to_char(order.orderDate, "YYYY-MM-DD HH24"));
q.orderBy(order.orderDate.asc());
List<Tuple> result = q.list(to_char(order.orderDate, "YYYY-MM-DD HH24"), order.quantity);
Run Code Online (Sandbox Code Playgroud)
to_char是我在这个帖子中找到的方法:https://groups.google.com/forum/#!msg /querydsl/WD04ZRon-88/nP5QhqhwCUcJ
我得到的例外是:
java.sql.SQLSyntaxErrorException:ORA-00979:不是GROUP BY表达式
我试了一下查询的几个变种而没有运气.
有谁知道查询失败的原因?谢谢 :)
您可以使用StringTemplate和DateTemplate来构建自定义表达式,就像在单元测试com.querydsl.sql.TemplateTest中所做的那样:
StringTemplate datePath = Expressions.stringTemplate(
"to_char({0},'{1s}')", order.orderDate, ConstantImpl.create("YYYY-MM-DD HH24"));
DateTemplate from = Expressions.dateTemplate(
Date.class, "to_date({0},'{1s}')", fromStr, ConstantImpl.create("DD.MM.YYYY"));
DateTemplate to = Expressions.dateTemplate(
Date.class, "to_date({0},'{1s}')", toStr, ConstantImpl.create("DD.MM.YYYY"));
query.select(datePath.as("order_date_hour"), order.quantity.sum().as("quantity"))
.from(order)
.where(order.orderDate.goe(from)
.and(order.orderDate.lt(to)))
.groupBy(datePath)
.orderBy(datePath.asc());
List<Tuple> results = query.fetch();
Run Code Online (Sandbox Code Playgroud)
这里的打印输出为query.getSQL().getSQL():
select to_char("order".order_date,'YYYY-MM-DD HH24') order_date_hour, sum("order".quantity) quantity
from "order" "order"
where "order".order_date >= to_date(?,'DD.MM.YYYY') and "order".order_date < to_date(?,'DD.MM.YYYY')
group by to_char("order".order_date,'YYYY-MM-DD HH24')
order by to_char("order".order_date,'YYYY-MM-DD HH24') asc
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1669 次 |
| 最近记录: |