我有两个实体:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
class A
@Entity
class B extends A
和spring JpaRepository接口:
@Repository
@PersistenceContext(type = PersistenceContextType.EXTENDED)
interface ARepository extends JpaRepository<A, Long>, JpaSpecificationExecutor<A>{
@Query(value = "SELECT a FROM A AS a")
List<A> find10(Pageable pageRequest)
}
当我打电话
find10(new PageRequest(0, 10, new Sort(Sort.Direction.ASC, 'name'))
- 它返回包含A
和B
记录的列表。类似于:
[B.class, B.class, A.class, B.class, A.class]
当我查询ARepository
时,我希望仅返回A
条记录,并且B
和BRepository
分别相同。
spring-jpa是否有办法实现这一目标?我正在使用一个版本的Hibernate,其中@DiscriminatorColumn
无法与TABLE_PER_CLASS
一起使用而我无法升级 - 因此这不是一个选项。
提前致谢。
答案 0 :(得分:0)
您应该为B.class创建存储库:
interface BRepository extends JpaRepository<B, Long>, JpaSpecificationExecutor<B> {
...
这应该有用。
使用ARepostiory
时,hibernate会创建 polimorphic query ,选择instanceof A
的所有实体。
当你使用BRepository
hibernate创建具体的类查询时。
编辑:
编辑:
也许你应该在类层次结构中添加新属性:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
class A {
public String getType() {
return "A";
}
}
@Entity
class B extends A {
@Override
public String getType() {
return "B";
}
}
这将向表定义引入新列type
。而hibernate将设置&#34; A&#34; A.class
和&#34; B&#34;为B.class
。您可以将类型从String更改为Enum以获得更强的JPA查询。