假设我有一个类Article
,它由Java Ebean自动映射为数据库表。
对于这个表,我想通过RawSql
查询来检索条目,因为当它涉及到具有许多连接的复杂查询时,我发现SQL更简单。到目前为止,我已经设法将我的SQL语句提供给Parser。查询是正确的,我已经检查过了。
唯一的问题是,我不知道,如何将数据库结果映射到我的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();
答案 0 :(得分:0)
自问题问题以来,Ebean发生了很多事情,但我认为这个问题仍然有效。新的RawSqlBuilder.tableMapping()使事情变得更容易,如下面的代码所示,但是仍然需要手动映射所有属性(没有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();
}