playframework-2.0 - 使用 Ebean SqlQuery 的最有效方法

标签 playframework-2.0 ebean

我有两个模型(为了讨论而简化),父模型和子模型处于一对多关系。 Child 有一个 String 属性类型。我想创建一个方法

public List<String> Parent.getTypes()

返回类型的不同列表。这是我能想到的最好的:

public List<String> getTypes() {
    String sql = "select distinct type from child where parent_id=:id";

    SqlQuery sqlQuery = Ebean.createSqlQuery(sql);
    sqlQuery.setParameter("parent", id);

    List<SqlRow> rows = sqlQuery.findList();
    List<String> types = new ArrayList<String>(rows.size());
    for (SqlRow row : rows)
        directions.add(row.getString("type"));

    return types;
}

我预计这个方法会被频繁调用。我假设这不是很有效。例如,每次调用 getTypes() 时,我都会创建一个新的 SqlQuery,即使查询除了参数之外是相同的。

哪里是初始化可重用 SqlQuery 的最佳位置?我尝试在父模型的顶部执行此操作,但出现异常,因为我猜模型初始化时数据库尚未准备好。我想我可以将其设置为 null 并在第一次调用 getTypes() 时对其进行初始化。执行此操作的“正确”方法是什么?

最佳答案

缓存非常便宜而且有用,你可以缓存 ie 10 分钟:

public List<String> getTypes(Integer parentId) {

    List<String> types = (List<String>) Cache.get("listOfTypes");
    if (types == null) {
        List<SqlRow> rows = Ebean
             .createSqlQuery("select distinct type from child where parent_id=:id")
             .setParameter("id", parentId)
             .findList();

        types = new ArrayList<String>(rows.size());
        for (SqlRow row : rows)
            types.add(row.getString("type"));

        Cache.set("listOfTypes", types, 600);
    }

    return types;
}

关于playframework-2.0 - 使用 Ebean SqlQuery 的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13080073/

相关文章:

jpa - Playframework 将列表发布到 Controller

playframework - 使用支持WebSocket的浏览器进行集成测试

scala - 将 play 2.2 应用程序移植到 2.3.2 版本时出错 (Scala)

scala - 如何获取客户端IP?

java - 玩2.3.x : Non-blocking image upload to Amazon S3

java - 我如何向 Ebean 描述桥接表?

playframework-2.0 - Ebean OrderBy CASE WHEN

java - 在 play.db.ebean.EbeanPlugin 中找不到合适的构造函数,如何解决此问题?

java - 从play框架2中的id生成外部id

java - 尽管 autoApply=false 并且属性未使用 @Convert 注释,但仍应用 JPA 属性转换器