代码之家  ›  专栏  ›  技术社区  ›  davidbaguetta

分析CriteriaQuery异常

  •  0
  • davidbaguetta  · 技术社区  · 6 年前

    我的数据库中有一个表,其中包含有关装运的信息,另一个表包含有关每个装运的状态转换历史记录的信息。最后一个表中的记录如下:

    | 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);
    
            // 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);
        }
    

    (实际获取发货的部分稍后完成,此代码片段只是排序部分)

    每当我执行代码时,我都会得到以下异常,我假设这是一个解析异常:

    antlr.NoViableAltException: unexpected AST node: query
    

    我假设问题出在方法最后一行的orderby(o)部分,因为如果我删除了该部分,则方法执行时没有任何问题(但没有排序装运的预期最终结果)。我不明白这个查询有什么问题。

    编辑 :我注意到,如果我试图用SQL重新创建查询,它会抱怨子查询中的GROUPBY子句,然后我删除了它,它运行得很好。对criteriaquery执行了相同的操作,但它仍然抛出了与以前相同的异常。

    0 回复  |  直到 6 年前