当前位置: 首页 > 面试题库 >

使用Ebean查询原始SQL时如何映射结果

祁高格
2023-03-14
问题内容

使用Ebean创建的Postgres表,我想用手写语句查询这些表:

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

每个联接表代表我的模型类之一。查询执行得很好,但是我不知道如何进行:

如何使用Play
2.2执行查询。和伊豆?如何将此查询映射到可迭代对象?我是否需要创建一个包含查询中所有字段的Model类,还是可以使用某种HashMap?如何以安全的方式参数化查询?


问题答案:

要执行此查询,您需要使用RawSql类。您还必须创建将结果投射到的类。

这是示例结果类的代码:

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;
}

以及执行此查询的示例:

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();


 类似资料:
  • 在模型查询API不够用的情况下,你可以使用原始的sql语句。django提供两种方法使用原始sql进行查询:一种是使用Manager.raw()方法,进行原始查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的sql语句。 警告 编写原始的sql语句时,应该格外小心。每次使用的时候,都要确保转义了参数中的任何控制字符,以防受到sql注入攻击。更多信息请参阅防止sql注入。 进行原始查询 r

  • 问题内容: 我正在根据CS50的网络系列创建一个应用程序,该程序要求我仅使用原始SQL查询而不是ORM。 我正在尝试提供一个搜索功能,用户可以在其中查找存储在数据库中的书籍列表。我想让他们查询名为“ books”的表格中的ISBN,标题,作者列 目前,它确实拍摄了“ GET”请求,没有问题,但是它没有返回任何数据,我认为问题出在我编写的SQL行中。 这是路线: 这是我的模板 任何人都可以发现问题吗

  • 嗨,我试图实现的是将SQL原生查询结果映射到java spring jpa存储库中的DTO中,如何正确地做到这一点?我尝试了几个代码,但都不起作用,下面是我所尝试的: 第二个错误是: 无法提取ResultSet;SQL[N/A];嵌套异常是org.hibernate.exception.SqlGrammareXception:无法提取ResultSet 下面是我的DTO:

  • 我有这样的桌子 数据如下所示,开始时间和结束时间是连续的时间跨度: 因此,如果用户传递两个参数,则可以在任意时间段内选择* 它应该以如下方式返回表: 你看,棘手的部分是将原始的时间跨度削减到用户定义的时间跨度(@from-@To),我已经为此奋斗了一整天。请指教。 提前非常感谢你!!!

  • 我有两个表,用户和角色,它们是多对多的 我正在使用EntityManager进行查询。 我如何使JPA知道映射一个用户和多个角色?

  • 我正在尝试使用sqlalchemy执行原始sql查询,并想知道什么是“正确”的方法。 我的查询如下(目前): 我不喜欢的是字符串格式和缺乏任何参数处理(你好music_volume引号:-D)。 我试图遵循这个答案: 如何在SQLAlchemy flask应用程序中执行原始SQL 应用我读到的内容后,我的代码片段如下所示: 然而,我得到的错误,mv和ml是不能识别的参数。 如果我把我的代码片段改成