我有两个模型(为了讨论而简化),父模型和子模型处于一对多关系。 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/