【问题标题】:Spring boot fetch database data for multiple IDs using single callSpring Boot 使用单个调用获取多个 ID 的数据库数据
【发布时间】: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


【解决方案1】:

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

findByNamesIn(Collection<String> names);

更多详情及其他查询,请参考https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多