QueryDSL:不支持的表达式总和

时间:2015-08-31 13:36:45

标签: querydsl

我有这个Bean对象:

@Entity
@Table(name="a_table")
public class A {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column(name="amount")
private int amount;

@ManyToOne
private B b;

@ManyToOne
private C c;

public MunicipalityInventory(int amount, B b, C c) {
    this.amount = amount;
    this.b = b;
    this.c = c;
}

我尝试将查询结果绑定到上面的对象。我对QueryDSL的第一次尝试是这样的(它在这种意义上工作,数据的呈现是正确的,但它没有将查询的属性绑定到对象,因为它返回了包含{{1}的Tuple },StringPath以及其他奇怪的数据类型)

NumberExpression

正如我所说,这有效,但现在我正在尝试将该示例转换为此(哦,public List<Tuple> findAll(){ QA a = QA.A; QB b = QB.b; QC c = QC.c; JPAQuery query = new JPAQuery(entityManager); return query.from(a) .innerJoin(a.b, b) .innerJoin(a.c, c) .orderBy(c.name.asc()) .groupBy(c.name, a.c, c.name) .list(a.amount.sum(), b.name, c.name); } 中的新条件需要进行此编译)所以我可以立即使用适当的对象:

groupBy

编译时会出现错误警告

    return query.from(a)
            .innerJoin(a.b, b)
            .innerJoin(a.c, c)
            .orderBy(b.name.asc())
            .groupBy(c.name, a.amount, b.id, c.id)
            .list(Projections.fields(A.class, a.amount.sum(), b, c));

为什么?根据我的理解,这应该有效。

1 个答案:

答案 0 :(得分:5)

Querydsl无法从sum()表达式中确定要填充的A字段。

使用别名来定义目标字段:

a.amount.sum().as("fieldName")

Querydsl在绑定到字段或属性时只能处理路径和别名表达式。