我的数据库中有一个表,其中包含有关装运的信息,而另一个表包含有关每个装运的状态转换历史的信息。最后一张表中的一条记录如下:
$('div').each(function(){
$(this).find('i').attr('data-partcount', $(this).find('.part').length);
});
我正在尝试获取按授权日期排序的货运清单。授权日期表示为状态转换表中的第一条记录,初始状态为3,最终状态为4。
这是我为CriteriaQuery实现的代码:
| date | initial_status | final_status | shipment_id
| 27-07-2009 | 4 | 8 | 245
(稍后实际完成发货的部分,此代码段只是排序部分)
无论何时执行代码,都会得到以下异常,我认为这是解析异常:
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);
// returns the authorization date for each queried shipment
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);
}
我认为问题出在方法最后一行的orderBy(o)部分,因为如果我删除该部分,该方法将执行而不会出现任何问题(但不会对已排序货件产生预期的最终结果)。我不明白查询是什么问题。
编辑:我注意到,如果我尝试在SQL中重新创建查询,它会抱怨子查询中的GROUP BY子句,之后我将其删除并正常运行。在CriteriaQuery上执行了相同的操作,但仍引发与以前相同的异常。