5

假设我有一个Article由 Java Ebean 自动映射为数据库表的类。

对于这个表,我想通过RawSql查询来检索条目,因为我发现 SQL 在处理具有许多连接等的复杂查询时更简单。到目前为止,我已经设法将我的 SQL 语句提供给 Parser。查询是正确的,我已经检查过了。

唯一的问题是,我不知道如何将数据库结果映射到我的Article班级。我知道,有一种columnMapping(...)方法,但老实说,我懒得手动映射每一列......

难道没有另一种方法可以像myResults.mapToClass(Article.class)检索 a 这样的东西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() 使事情变得更容易,如下面的代码所示,但是 afaik 它仍然需要手动映射所有属性(否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 回答