微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Spring Boot使用单个调用获取多个ID的数据库数据

在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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。