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),这是预期的行为。这解决了创建由实体和投影实现的超级接口。
我有一个代表 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),这是预期的行为。这解决了创建由实体和投影实现的超级接口。