Spring Data JPA 动态投影从 MySQL 检索所有列

SpringData JPA dynamic projections retrieve all columns from MySQL

我有一个代表 MySQL table:

的实体
@Entity
@Table(name = "account")
@Getter
@Setter
@SuppressWarnings("serial")
public class AccountEntity implements AccountBaseEntity, AccountRoleEntity, Serializable {

    @Id
    @GeneratedValue(generator = "uuid2")
    @Column(name = "account_id")
    private UUID accountId;

    @Column(name = "email")
    @NotBlank
    private String email;

    @Column(name = "role")
    @NotBlank
    private String role;

    @Column(name = "creation_time")
    @NotNull
    private Timestamp creationTime;

}

它实现了这个接口:

public interface AccountBaseEntity {

    UUID getAccountId();

}

然后我有一些预测也在实施它。例如:

public interface AccountRoleEntity extends AccountBaseEntity {

    String getRole();

}

这是我的存储库,其中有一个动态投影:

public interface AccountsRepository extends JpaRepository<AccountEntity, UUID> {

    <T extends AccountBaseEntity> T findByEmail(String email, Class<T> type);

}

我将它与此代码一起使用:

AccountRoleEntity accountRoleEntity = accountsRepository.findByEmail(email, AccountRoleEntity.class);

我检查了 Spring-Boot 属性 spring.jpa.show-sql = true 的查询设置,这是我所看到的:

Hibernate: select accountent0_.account_id as account_1_0_, accountent0_.creation_time as creation2_0_, accountent0_.email as email3_0_, accountent0_.role as role10_0_ from account accountent0_ where accountent0_.email=?

我原以为查询 select 只有 account_id 和角色列,但它似乎正在检索实体并将其转换为投影,而不是检索投影本身。这是一个错误还是我做错了什么?

我刚刚意识到这是因为 AccountEntity 扩展了 AccountRoleEntity。这是正常行为吗?

我希望实体扩展投影,这样我就可以有一个通用接口,用于一些应该同时适用于实体和投影的方法。

编辑:

如此处所述 (https://github.com/spring-projects/spring-data-jpa/issues/2179),这是预期的行为。这解决了创建由实体和投影实现的超级接口。