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 に答える