5

ArticleJava Ebean によってデータベース テーブルとして自動的にマップされるクラスがあるとします。

このテーブルではRawSql、多くの結合などを含む複雑なクエリになると SQL がより単純になるため、クエリを介してエントリを取得したいと考えました。これまでのところ、SQL ステートメントをパーサーに渡すことができました。クエリは正しいです、私はすでにそれをチェックしました。

Article唯一の問題は、データベースの結果をクラスにマップする方法がわからないことです。メソッドがあることは知っていますがcolumnMapping(...)、正直なところ、すべての列を手動でマッピングするのが面倒です...

myResults.mapToClass(Article.class)のようなものを取得したい別の方法はありませんList<Article>か?

これは私がすでに持っているコードです:

Finder<String, Article> find = new Finder<String, Article>(
        String.class, Article.class);
String sql = "SELECT * FROM article [...]";
RawSql rawSql = RawSqlBuilder.parse(sql).create();
List<Article> returnList = find.setRawSql(rawSql).findList();

または:

Finder<String, Article> find = new Finder<String, Article>(
                String.class, Article.class);
String sql = "SELECT id, title, sub_title FROM article [...]";
RawSql rawSql = RawSqlBuilder.parse(sql)
            .columnMapping("id", "id")
            .columnMapping("title", "title")
            .columnMapping("sub_title", "subTitle")
            .create();
List<Article> resultList = find.setRawSql(rawSql).findList();
4

1 に答える 1

1

質問がされてから Ebean で多くのことが起こりましたが、問題はまだ有効だと思います。以下のコードに見られるように、新しい RawSqlBuilder.tableMapping() により作業が簡単になりますが、すべての属性を手動でマッピングする必要があります (no SELECT table.* FROM table) 。

私はまさにこの問題を抱えており、マップ先のヘルパー オブジェクト (@Entity/@Sql) を作成することでこれを回避しました。例: CustomerWithPurchaseStats

エキス:

@Entity
@Sql
public class CustomerWithPurchaseStats {

    @OneToOne
    private Customer customer;
...

そしてDAOで:

public List<CustomerWithPurchaseStats> getAllCustomersWithPurchaseStats() {
    StringBuilder sql = new StringBuilder("SELECT cu.id, <manually add all fields you need mapped ").append(" FROM customer cu ");
    RawSqlBuilder rawSqlBuilder = RawSqlBuilder.parse(sql.toString());
    rawSqlBuilder.tableAliasMapping("cu", "customer").create();
    return Ebean.find(CustomerWithPurchaseStats.class)
                .setRawSql(rawSqlBuilder.create())
                .findList();
}
于 2016-06-13T08:53:46.253 に答える