【问题标题】:Spring Data JPA Projection CollectionsSpring Data JPA 投影集合
【发布时间】:2026-01-12 09:45:02
【问题描述】:

如何在保持投影关闭的同时获得与使用投影的用户相关的所有权限?

用户

@ElementCollection
@Enumerated(EnumType.STRING)
private List<Permission> permissions;

权限

public enum Permission {
    ADD, UPDATE, DELETE
}

UserRepository 查询

@Query("select u.username as username, p as permissions from User u " 
    + "inner join u.permissions p"
List<UserWithPermissions> findAllProjection();

UserWithPermissions 投影

public interface UserWithPermissions {
    String getUsername();
    List<Permission> getPermissions();
}

我想得到的输出

User1 : ADD
User2 : ADD DELETE

我得到的输出

User1 : ADD
User2 : ADD
User2 : DELETE

【问题讨论】:

  • 看起来您可能需要一个group by u.username 子句。
  • @Alexander 然后权限需要出现在GROUP BY 中,然后它实际上并没有做任何事情。我想,不知何故,我需要在投影中对其进行分组,也许为权限创建另一个接口,这将作为按 user.id 对其进行分组,尽管无法使其工作。
  • 你的用户类是什么样子的?能给个代码吗?
  • 您如何管理权限,将每个权限保留在单独的行中或将所有权限保留在单个列中。
  • @AtulSharma 单独,刚刚添加了我的用户类和权限字段。

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


【解决方案1】:

只需将您的查询更改为

@Query("select u from User u")
List<UserWithPermissions> findAllProjection();

这应该可行。

【讨论】:

  • 查询丢失join fetch u.permissions,这也使投影打开,这意味着它获取所有列,我使用投影的目标是仅选择所需的列。此外,权限似乎是分组的,但输出仍然是 3 个不同的行,尝试使用 distinct 使输出为空。
  • 编辑:删除@Query 注释并使用@EntityGraph 获取权限我得到了我想要的输出,但投影仍然保持打开状态。