首页 > 解决方案 > 在具有 Inheritancetype.TABLE_PER_CLASS 的实体上使用 JPARepository 会导致错误查询

问题描述

我使用继承类型“TABLE_PER_CLASS”在我的项目中定义了 2 个实体。之后,我定义了 2 个存储库来访问数据,但是,当我使用它们查找 B 实体的记录时,生成的查询不包含 JOIN 语句,而仅包含“SELECT id, name, alternate_name from b”,它失败了,因为“名称”字段不存在。

我错过了什么我看不到的东西吗?

实体 A:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "a")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public abstract class A implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

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

    ...
    ...
}

实体 B:

@Entity
@Table(name = "b")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class B extends A implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @Column(name = "alternate_name")
    private String alternateName;

    ...
    ...
}

基础存储库:

@SuppressWarnings("unused")
@NoRepositoryBean
public interface BaseRepository<T extends A> extends JpaRepository<T, Long> {

}

存储库:

@SuppressWarnings("unused")
@Repository
public interface ARepository extends BaseRepository<A> {

}

B存储库:

@SuppressWarnings("unused")
@Repository
public interface BRepository extends BaseRepository<B> {

}

标签: springinheritancespring-data-jpatable-per-class

解决方案


我假设你有一个表 a 和一个表 b。

但是 TABLE_PER_CLASS 只会为每个具体子类生成/使用一个表。在你的情况下只是表b。

如果您想要表 a 和 b,则必须使用 JOINED 策略。


推荐阅读