如何使JpaRepository仅返回存储库指定类的记录?

时间:2014-10-03 16:19:24

标签: java spring hibernate groovy spring-data-jpa

我有两个实体:

@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'))

来自服务的

- 它返回包含AB记录的列表。类似于:

[B.class, B.class, A.class, B.class, A.class]

当我查询ARepository时,我希望仅返回A条记录,并且BBRepository分别相同。

spring-jpa是否有办法实现这一目标?我正在使用一个版本的Hibernate,其中@DiscriminatorColumn无法与TABLE_PER_CLASS一起使用而我无法升级 - 因此这不是一个选项。

提前致谢。

1 个答案:

答案 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查询。