【问题标题】:QueryDSL: Unsupported expression sumQueryDSL:不支持的表达式总和
【发布时间】:2015-08-31 13:36:45
【问题描述】:

我有这个 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 的第一次尝试是这样的(从某种意义上说,它的工作原理是数据的呈现是正确的,但它没有将查询的属性绑定到对象,因为它返回了包含 StringPath、@987654324 的 Tuple @ 和其他奇怪的数据类型)

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

编译时会给出错误警告

java.lang.IllegalArgumentException: Unsupported expression sum(a.amount)
    at com.mysema.query.types.QBean.createBindings(QBean.java:70)

这是为什么呢?据我了解,这应该可行。

【问题讨论】:

    标签: querydsl


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-29
      • 2020-09-30
      • 2019-08-31
      • 2020-11-30
      • 1970-01-01
      • 2022-08-10
      • 2017-06-07
      • 2021-10-25
      相关资源
      最近更新 更多