Spring Boot使用单个调用获取多个ID的数据库数据

时间:2020-09-08 10:04:52

标签: java spring-boot jpa spring-data-jpa

在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

1 个答案:

答案 0 :(得分:0)

您可以使用IN查询。您需要声明您的方法签名,如下所示:

findByNamesIn(Collection<String> names);

有关更多详细信息和其他查询,请参见https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation