我的数据库中有一个表,其中包含有关装运的信息,另一个表包含有关每个装运的状态转换历史记录的信息。最后一个表中的记录如下:
| date | initial_status | final_status | shipment_id
| 27-07-2009 | 4 | 8 | 245
我正试图得到一份按授权日期排序的装运清单。此授权日期表示为状态转换表中的第一条记录,初始状态为3,最终状态为4。
这是我为criteriaquery实现的代码:
private void sortByAuthDate(Root<ShipmentTbl> root, CriteriaQuery<?> query, CriteriaBuilder builder, ListSort sort) {
Subquery<Timestamp> authDateQuery = query.subquery(Timestamp.class);
Root<StatusTransitionMessageTbl> stmRoot = authDateQuery.from(StatusTransitionMessageTbl.class);
Predicate shipmentId = builder.equal(stmRoot.<ShipmentTbl>get("shipment").<String>get("id"), root.<String>get("id"));
Predicate initialStatus = builder.equal(stmRoot.<Integer>get("initialStatus"), 3);
Predicate finalStatus = builder.equal(stmRoot.<Integer>get("finalStatus"), 4);
authDateQuery.select(builder.least(stmRoot.<Timestamp>get("date")))
.where(builder.and(shipmentId, initialStatus, finalStatus))
.groupBy(stmRoot.<ShipmentTbl>get("shipment").<String>get("id"));
Expression<Timestamp> authDate = authDateQuery.getSelection();
Order o = sort.getSortDirection() == ListSort.SortDirection.ASC ? builder.asc(authDate) : builder.desc(authDate);
query.multiselect(authDate).orderBy(o);
}
(实际获取发货的部分稍后完成,此代码片段只是排序部分)
每当我执行代码时,我都会得到以下异常,我假设这是一个解析异常:
antlr.NoViableAltException: unexpected AST node: query
我假设问题出在方法最后一行的orderby(o)部分,因为如果我删除了该部分,则方法执行时没有任何问题(但没有排序装运的预期最终结果)。我不明白这个查询有什么问题。
编辑
:我注意到,如果我试图用SQL重新创建查询,它会抱怨子查询中的GROUPBY子句,然后我删除了它,它运行得很好。对criteriaquery执行了相同的操作,但它仍然抛出了与以前相同的异常。