2

我有两个模型(为讨论而简化),父级和子级处于 OneToMany 关系。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 的最佳位置在哪里?我试图在父模型的顶部执行此操作,但出现异常,因为我猜模型初始化时数据库尚未准备好。我想我可以在第一次调用 getTypes() 时将其设为 null 并对其进行初始化。这样做的“正确”方法是什么?

4

1 回答 1

3

缓存非常便宜且有用,您可以将其缓存 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;
}
于 2012-10-26T10:07:31.023 回答