0

我在 Postgres 9.4.5 数据库之上使用 Play 2.4.6。

我正在尝试获取数据库中捐赠的总和,但我希望我的用户能够动态过滤查询中包含的捐赠。我遵循了一些示例,并创建了一个新类 DonationAggregate,并用@Entity和注释@Sql。由于我想做一个聚合查询,我必须手动设置要运行的 Sql,这工作正常。当我尝试向附加到我的查询的 ExpressionList 添加一些过滤器时,就会出现问题 - 我尝试过滤属性名称,但名称没有从逻辑名称转换为物理名称。它们被解释为逻辑名称,当然这些列不存在。

我的问题是如何使用 RawSql 查询,但还允许使用物理名称添加 ExpressionList 上的过滤器?目前,当我运行以下代码时,出现异常: Execution exception[[PersistenceException: Query threw SQLException:ERROR: column "lastfour" does not exist.

还可能值得注意的是,如果我更改 .eq("lastFour", "1234").eq("last_four", "1234") 按预期工作。但是由于我将应用的过滤器是动态的并且是基于逻辑/属性名称生成的,所以我无法提前进行这些转换。

捐赠.java

@Entity
@EntityConcurrencyMode(ConcurrencyMode.NONE)
public class Donation extends Model {

    @Id
    private Long id;
    private BigDecimal amount;
    private String lastFour;

    public List<DonationAggregate> getAggregated() {

        String rawSql = "select sum(d.amount) as total from donation d";

        RawSql rawTransaction = RawSqlBuilder.parse(rawSql).create();

        ExpressionList<DonationAggregate> donationFilters = Ebean.find(DonationAggregate.class)
                .setRawSql(rawTransaction)
                .where().eq("lastFour", "1234") //---eventually this will be dynamic, so I won't know which columns are being used
                .findList();
    }

    //---getters/setters
}

DonationAggregate.java

@Entity
@Sql
public class DonationAggregate {

    private BigDecimal total;

    @OneToOne
    private Donation donation;

    //---Getters/setters
}
4

1 回答 1

0

还可能值得注意的是,如果我将 .eq("lastFour", "1234") 更改为 .eq("last_four", "1234")

“lastFour”不是 DonationAggregate 的属性,而是 Donation 的属性。这就是为什么“lastFour”没有被翻译的原因,因为它不是 DonationAggregate 的已知属性(它是查询的根类型)。

嗯。

于 2016-01-19T03:34:26.910 回答