播放框架,搜索数据的最佳方式,查找器与列表

时间:2014-02-11 18:18:44

标签: playframework playframework-2.0 performance

我最近开始使用play框架,我有一个基本问题。 我有这2个型号:

@Entity
public class User extends Model {

...
private int age;
@ManyToOne
private Project project;
...
}

@Entity
public class Project extends Model {

...
@OneToMany(mappedBy = "project")
private List<User> members = new ArrayList<User>();
...
}

现在,对于一个Project p,我想找到所有20岁的用户。 最好的方法是什么?

我应该在项目模型中创建一个功能来搜索列表

public List<User> getUsers(int age){
    List<User> temp = new ArrayList<User>();
    for(User u : members)
        if(u.getAge() == age)
            temp.add(u);

    return temp;
}

或者我应该使用取景器

 List<User> temp = User.find.where.eq("age", 20).eq("project", p).findList();

由于

2 个答案:

答案 0 :(得分:0)

如果使用列表,则表示必须将数据库中的所有用户加载到应用程序中。如果数据库中没有很多用户(例如,少于100个),那么这可能不是问题。如果数据库中有数百万用户,则应用程序将会崩溃,因为数据库会尝试向所有用户发送MB或GB数据。

如果使用finder,则会导致数据库上的SQL调用只获得您想要的结果。此外,如果您在项目和年龄字段上创建索引,那么数据库可以非常有效地进行搜索,它不必循环遍历每个用户,它只需要转到索引并在单个结果中获得结果步骤

此外,如果该年龄段的用户数量非常大,您可能需要进行分页。使用finder,您可以让数据库进行分页,因此您只需获取当前页面,而不必将所有结果加载到您的应用程序中,然后排除您不感兴趣的页面。

一般情况下,您应始终将查找数据的负载放在数据库上,因此您应始终使用查找程序。

答案 1 :(得分:0)

与许多代码效率问题一样:这取决于您的用例。

一方面,如果您(在数据库中)加载项目并在对特定成员(此处年龄为20岁的用户)执行某些操作后显示其所有成员,则搜索已加载的列表会更有效。< / p>

要在列表中搜索意味着将加载列表中的所有数据(如果此列表是延迟加载的)。

另一方面,如果您只对特定用户执行某些操作而不对其他成员执行任何操作,则只加载数据库中的特定成员更快。

使用finder让数据库限制要在应用程序中加载的数据(如果列表是延迟加载的话,再次加载),但如果已经急切地加载了列表,则会再次重新加载特定成员。

大多数情况下,ORM将懒惰加载一对多关系。如果此请求不需要其他成员,则应使用finder方法。