弹簧数据 jpa 投影在存在多对多注释时重复输出



我有一个与权威类相关的用户类,它们之间有多对多关系。

我正在使用投影来检索没有某些字段的用户列表。当我检索用户拥有的权限列表时出现问题,因为每个权限弹簧都会向我返回两次相同的对象。

用户类

@Entity
@Table(name = "user")
public class User {

@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "user_seq")
@SequenceGenerator(name = "user_seq", sequenceName = "user_seq", allocationSize = 1)
private Long id;
@Column(name = "apiKey", updatable = false, nullable = false, unique=true, columnDefinition = "BINARY(16)")    
private UUID apiKey;

@Column(name = "USERNAME", length = 50, unique = true)
@NotNull
@Size(min = 4, max = 50)
private String username;
@Column(name = "PASSWORD", length = 100)
@NotNull
@Size(min = 4, max = 100)
private String password;
@Column(name = "FIRSTNAME", length = 50)
@NotNull
@Size(min = 4, max = 50)
private String firstname;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
        name = "USER_AUTHORITY",
        joinColumns = {@JoinColumn(name = "USER_ID", referencedColumnName = "ID")},
        inverseJoinColumns = {@JoinColumn(name = "AUTHORITY_ID", referencedColumnName = "ID")})
private List<Authority> authorities;

}

用户存储库

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
    List<UserWithUuid> findAllByNodeId(Long nodeId);  
    interface UserWithUuid {
        String getFirstname();
        String getLastname();       
        String getEmail();
        List<Authority> getAuthorities();
        UUID getApiKey();
    }

}

正如您在输出中看到的,它返回两次相同的用户,但具有不同的角色。

输出

[
    {
        "firstname": "daniel",
        "lastname": "mancera",
        "email": "daniel.mancera@dmance.eu",
        "apiKey": "7961609f-79d4-4ef2-9baa-6809978c038b",
        "authorities": [
            {
                "id": 1,
                "name": "ROLE_USER"
            }
        ]
    },
    {
        "firstname": "daniel",
        "lastname": "mancera",
        "email": "daniel.mancera@dmance.eu",
        "apiKey": "7961609f-79d4-4ef2-9baa-6809978c038b",
        "authorities": [
            {
                "id": 2,
                "name": "ROLE_MANAGER"
            }
        ]
    },
    {
        "firstname": "Roger",
        "lastname": "Rabbit",
        "email": "roger.rabiit@rab.it",
        "apiKey": "023bf60b-e79b-461f-bd30-65a920fe99e4",
        "authorities": [
            {
                "id": 1,
                "name": "ROLE_USER"
            }
        ]
    }
]

很可能是这个错误 https://jira.spring.io/browse/DATAJPA-1173

它在当前版本的 Spring 数据中已修复,因此升级您使用的版本应该可以解决此问题。

最新更新