Hibernate继承 - 无法在jpql查询

时间:2018-02-03 17:14:02

标签: java hibernate jpa

我有基本实体 - 带继承的UserEntity:加入:

@Entity
@Table(name = "users")
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode()
@Inheritance(strategy = InheritanceType.JOINED)
public class UserEntity implements UserDetails {
    @Id
    @Column(name = "id", nullable = false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_seq")
    @SequenceGenerator(name = "user_seq", sequenceName = "user_id_seq", allocationSize = 1)
    private Long id;
    //other fields
    }

和chield实体:AdminEntity,PartnerEntity,ClientEntity。

例如ClientEntity:

@Entity
@Table(name = "client")
@Data
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
@PrimaryKeyJoinColumn(name = "client_id", referencedColumnName = "id")
public class ClientEntity extends UserEntity {
//other fields
}

我有疑问,我不需要知道与我合作的用户类型。 为清楚起见,您可以在需要重置密码时提供功能。您需要找到用户并创建密码重置令牌。 在jpa存储库中,我有通过电子邮件找到用户的简单方法

  Optional<UserEntity> findByEmail(String email);

但是我看到hibernate做了3个左连接来找出我正在处理的用户类型。 我该如何解决这个问题并获得基类?我正在尝试向UserEntity添加此注释:

@Polymorphism(type = PolymorphismType.EXPLICIT)

但它不起作用。 当我试图写这样的查询

 @Query("select u from UserEntity u where type (u) = UserEntity and u.email = :email")
    Optional<UserEntity> findByEmail(@Param("email")String email);

但我总是无效。  我知道我可以将策略更改为SINGLE_TABLE,但在此类查询中,所有字段都将从我不需要的数据库中获取。  有什么想法吗?

0 个答案:

没有答案