如何为JPA Criteria Group By子句创建表达式列表?

时间:2016-07-01 14:52:48

标签: java jpa criteria

我正在尝试使用groupBy子句创建JPA Criteria Query。 在我的例子中,我的groupBy子句是动态的,所以我试图使用它:

CriteriaQuery<T> groupBy(List<Expression<?>> grouping);

而不是通常的:

CriteriaQuery<T> groupBy(Expression<?>... grouping);

问题是我正在努力创建这个表达式列表。 这是我目前的代码:

    CriteriaQuery<Tuple> criteria = cb.createTupleQuery();
    Root<Foo> foo = criteria.from(Foo.class);

    Expression<String> barExp = foo.get("bar");
    Expression<String> bazExp = foo.get("baz");

    // I'd like to use a Expression List to build a dynamic group by clause with this. But something looks wrong and I don't know where...
    List<Expression<String>> groupBy = Arrays.asList(barExp, bazExp);

    // Consulta
    criteria.multiselect(barExp, bazExp);
    criteria.where(where);

    // this works:
    criteria.groupBy(barExp, bazExp);
    // but I'd like to use this, but compiler give me a type error
    //criteria.groupBy(groupBy);

    TypedQuery<Tuple> query = em.createQuery(criteria);
    List<Tuple> result = query.getResultList();

就是这样。 如何为groupBy动态创建JPA 2条件表达式列表?

提前致谢!

1 个答案:

答案 0 :(得分:1)

在这里回答我自己的问题,希望这对其他人有用。

经过一番思考后,我发现了:

List<Expression<String>>

编译器试图使用不需要的重载版本:

CriteriaQuery<T> groupBy(Expression<?>... grouping);

而不是我想要的版本:

CriteriaQuery<T> groupBy(List<Expression<?>> grouping);

Eclipse帮我修改了代码中的类型错误:

// ...

Expression<?> barExp = foo.get("bar");
Expression<?> bazExp = foo.get("baz");
List<Expression<?>> groupBy = Arrays.asList(codigoUGR, codigoGND);

// ...
criteria.groupBy(groupBy);

这似乎解决了这个问题。 Java通配符语法(“?”)对我来说有点不为人知,但eclipse Quick Fix Suggestions再次得到了解决:)