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

Playframework 播放框架,搜索数据的最佳方式,查找器与列表,playframework,playframework-2.0,performance,Playframework,Playframework 2.0,Performance,我最近开始使用play框架,我有一个基本问题。 我有两种型号: @Entity public class User extends Model { ... private int age; @ManyToOne private Project project; ... } 及 @实体 公共类项目扩展模型{ ... @OneToMany(mappedBy=“项目”) 私有列表成员=新的ArrayList(); ... } 现在,对于一个项目p,我想找到所有20岁的用户。 最好的方法是什么 我

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

@Entity
public class User extends Model {

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

@实体
公共类项目扩展模型{
...
@OneToMany(mappedBy=“项目”)
私有列表成员=新的ArrayList();
...
}
现在,对于一个项目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;
}
public List getUsers(int年龄){
List temp=new ArrayList();
用于(用户u:成员)
如果(u.getAge()==年龄)
温度加成(u);
返回温度;
}
或者我应该用取景器吗

 List<User> temp = User.find.where.eq("age", 20).eq("project", p).findList();
List temp=User.find.where.eq(“年龄”),20.eq(“项目”,p.findList();

谢谢

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

如果使用查找器,则会对数据库进行SQL调用,以获得所需的结果。此外,如果在项目和年龄字段上创建索引,那么数据库可以非常高效地进行搜索,它不必遍历每个用户,它只需转到索引并在一个步骤中获得结果

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


一般来说,您应该始终将查找数据的任务放在数据库上,因此您应该始终使用查找器。

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

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

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

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

使用查找器,让数据库限制要在应用程序中加载的数据(如果列表是延迟加载的,则再次加载),但如果列表已被急切加载,则将再次重新加载特定成员


通常,ORM将延迟加载一对多关系。如果此请求不需要其他成员,则应使用finder方法

谢谢你的帮助。还有一个问题,如果我加载一个项目以使用另一个信息,如名称等,则在我调用它之前不会加载成员列表,或者在我加载项目(项目p=…)后,所有信息都将加载?正如我所写的,ORM将延迟加载一对多关系(但您可以配置为急切地获取它)。在调用project.members之前,不会加载它们。
 List<User> temp = User.find.where.eq("age", 20).eq("project", p).findList();