问题描述
在spring boot项目中,我有以下代码,由于在循环内发生多个数据库调用,因此会导致性能降低。
userList.forEach(user -> {
List<Project> userProjectsList = ProjectRepository.findByUser_UserIdOrderByDatecompletedDesc(user.getUserId());
}
注意:userList是从存储过程返回的列表。 项目是一个实体。该实体的相关存储库为ProjectRepository。 用户也是实体。 项目和用户实体具有多对一关系。
项目实体如下所示;
@Entity
@Table(name = "Project")
public class Project {
@Id
@GeneratedValue
private Integer projectid;
private Calendar datecompleted;
@ManyToOne
@JoinColumn(name = "userid",referencedColumnName = "userid")
private User user;
// getters and setters
}
我需要修改此代码以提高效率。作为解决方案,我计划从数据库中一次一次获取属于所有用户的所有项目。 (正在使用MysqL数据库)
我尝试了以下代码,但似乎不正确。
List<Integer> userIdList = UserList.stream().map(User::getUserId).collect(Collectors.toList());
List<List<Project>> userProjectsList = ProjectRepository.findByUser_UserIdInorderByDatecompletedDesc(userIdList);
以下方法在ProjectRepository中。
List<List<Project>> findByUser_UserIdInorderByDatecompletedDesc(List<Integer> userIdList);
更新:
以上代码未返回正确的结果。我传递了2个userIds。其中一个用户有2个项目,另一个用户有1个项目。 预期结果是:
[0]->[0]:project1,[1]:project2
[1]->[0]:project3
但是,返回的结果是:
[0]->[0]:project1
[1]->[0]:project2
[2]->[0]:project3
解决方法
您可以使用IN
查询。您需要声明您的方法签名,如下所示:
findByNamesIn(Collection<String> names);
有关更多详细信息和其他查询,请参见https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation