【发布时间】:2020-09-08 10:04:52
【问题描述】:
在 Spring Boot 项目中,我有以下代码导致性能低下,因为多个数据库调用发生在循环内,这是一种不好的做法。
userList.forEach(user -> {
List<Project> userProjectsList = ProjectRepository.findByUser_UserIdOrderByDatecompletedDesc(user.getUserId());
}
注意: userList 是从存储过程返回的 List。 项目是一个实体。该实体的相关存储库是 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 个用户 ID。其中一个用户有 2 个项目,另一个用户有 1 个项目。 预期结果是:
[0]->[0]:project1, [1]:project2
[1]->[0]:project3
但是,返回的结果是:
[0]->[0]:project1
[1]->[0]:project2
[2]->[0]:project3
【问题讨论】:
-
您遇到的问题是什么,是不工作还是什么,请解释一下?
-
我认为您应该首先考虑您的数据库设计。我的意思是用户和项目之间的关系是什么。如果它是多对多关系,那么您可以创建一个中间表并相应地更改您的查询。然后,您只需一步即可选择所有用户的所有项目。查看baeldung.com/hibernate-many-to-many
-
@code_mechanic 我更新了我面临的问题。
-
@Onur Baştürk 正如我提到的项目和用户具有多对一关系。实际上,在这个阶段我无法更改数据库设计。
-
@koko 我认为你不能使用 JPQL 或 QUERY 来做这样的想法,你希望所有项目都按用户分组,而且也只传递 userIds,你需要自己对结果进行分组,因为数据将以行的形式出现,它不会自己创建组。
标签: java spring-boot jpa spring-data-jpa