How to map Results when Querying raw SQL using Ebean

让人想犯罪 __ 提交于 2019-12-21 20:43:15

问题


Using Postgres Tables created by Ebean, I would like to query these tables with a hand-written statement:

SELECT r.name,
       r.value,
       p.name as param1,
       a.name as att1,
       p2.name as param2,
       a2.name as att2
FROM compatibility c
JOIN attribute a ON c.att1_id = a.id
JOIN attribute a2 ON c.att2_id = a2.id
JOIN PARAMETER p ON a.parameter_id = p.id
JOIN PARAMETER p2 ON a2.parameter_id = p2.id
JOIN rating r ON c.rating_id = r.id
WHERE p.problem_id = %d
  OR p2.problem_id = %d

Each of the joined tables represent one of my model classes. The query executes fine, but I don't know how I would proceed:

How do I even execute the query using Play 2.2. and Ebean? How can I map this query to an iterable object? Do I need to create a Model class which contains all the fields from the query, or can I use some sort of HashMap? How can I parameterize the query in a safe way?


回答1:


To execute this query you need to use RawSql class. You will also have to create class to which results will be casted.

Here is a code of exemplary result class:

import javax.persistence.Entity;    
import com.avaje.ebean.annotation.Sql;  

@Entity  
@Sql  
public class Result {  

    String name;  
    Integer value;  
    String param1;
    String param2;
    String att1;
    String att2;
} 

And example of executing this query:

String sql   
    = " SELECT r.name,"
    + " r.value,"
    + " p.name as param1,"
    + " a.name as att1,"
    + " p2.name as param2,"
    + " a2.name as att2"
    + " FROM compatibility c"
    + " JOIN attribute a ON c.att1_id = a.id"
    + " JOIN attribute a2 ON c.att2_id = a2.id"
    + " JOIN PARAMETER p ON a.parameter_id = p.id"
    + " JOIN PARAMETER p2 ON a2.parameter_id = p2.id"
   + " JOIN rating r ON c.rating_id = r.id"
    + " WHERE p.problem_id = %d"
    + "   OR p2.problem_id = %d"

RawSql rawSql =   
    RawSqlBuilder  
        .parse(sql)  
        .columnMapping("r.name",  "name")  
        .columnMapping("r.value", "value")  
        .create();   

Query<Result> query = Ebean.find(Result.class);  
query.setRawSql(rawSql)
    .where().gt("amount", 10);     

List<Result> list = query.findList();   


来源:https://stackoverflow.com/questions/25930119/how-to-map-results-when-querying-raw-sql-using-ebean

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!