我在 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
}