Playframework 2.0 使用ebeansqlquery的最有效方法

Playframework 2.0 使用ebeansqlquery的最有效方法,playframework-2.0,ebean,Playframework 2.0,Ebean,我有两种模式(简化后供讨论),一种是单亲关系中的父母和孩子。子对象具有字符串属性类型。我想创建一个方法 public List<String> Parent.getTypes() public List Parent.getTypes() 返回不同类型的列表。这是我能想到的最好的办法: public List<String> getTypes() { String sql = "select distinct type from child where par

我有两种模式(简化后供讨论),一种是单亲关系中的父母和孩子。子对象具有字符串属性类型。我想创建一个方法

public List<String> Parent.getTypes()
public List 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;
}
public List getTypes(){
String sql=“选择与子项不同的类型,其中父项\u id=:id”;
SqlQuery SqlQuery=Ebean.createSqlQuery(sql);
setParameter(“父”,id);
List rows=sqlQuery.findList();
列表类型=新的ArrayList(rows.size());
for(SqlRow行:行)
add(row.getString(“type”);
返回类型;
}
我希望经常调用此方法。我想这不是很有效。例如,每次调用getTypes()时,我都会创建一个新的SqlQuery,即使查询除了参数之外是相同的


初始化可重用SqlQuery的最佳位置在哪里?我试图在父模型的顶部执行此操作,但我得到了异常,因为我猜在初始化模型时DB还没有准备好。我想我可以在第一次调用getTypes()时将其设为null并初始化。“正确”的方法是什么?

缓存非常便宜且有用,您可以将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;
}
public List getTypes(整数parentId){
列表类型=(List)Cache.get(“listOfTypes”);
如果(类型==null){
列表行=Ebean
.createSqlQuery(“从父项\u id=:id的子项中选择不同的类型”)
.setParameter(“id”,父id)
.findList();
types=newarraylist(rows.size());
for(SqlRow行:行)
type.add(row.getString(“type”);
set(“listOfTypes”,types,600);
}
返回类型;
}

我应该补充一点,类型几乎从不改变。我是否也应该以某种方式缓存此列表?