Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么hibernate在已经知道目标类型的情况下搜索鉴别器列?_Hibernate_Jpa - Fatal编程技术网

为什么hibernate在已经知道目标类型的情况下搜索鉴别器列?

为什么hibernate在已经知道目标类型的情况下搜索鉴别器列?,hibernate,jpa,Hibernate,Jpa,我有两个类(Foo和Moo),我正在hibernate应用程序中工作。这两个类都扩展了Bar Foo --- extends ---> Bar Moo --- extends ---> Bar 除了Foo和Moo各自实现不同的标记接口外,Foo和Moo以及Bar在各个方面都是相同的 换句话说,Foo实现了IFoo并扩展了Bar。Moo实现了IMoo并扩展了Bar。然而,IFoo或IMoo接口都没有为图片引入任何新方法,因为它们只是标记接口 此外,我还有几个JPA存储库类 @Rep

我有两个类(Foo和Moo),我正在hibernate应用程序中工作。这两个类都扩展了Bar

Foo --- extends ---> Bar 
Moo --- extends ---> Bar
除了Foo和Moo各自实现不同的标记接口外,Foo和Moo以及Bar在各个方面都是相同的

换句话说,Foo实现了IFoo并扩展了Bar。Moo实现了IMoo并扩展了Bar。然而,IFoo或IMoo接口都没有为图片引入任何新方法,因为它们只是标记接口

此外,我还有几个JPA存储库类

@Repository
public class FooRepository extends JpaRepository<Foo, Long> {
    public Foo findFooById(id);
}
@存储库
公共类FooRepository扩展了JpaRepository{
公共Foo findFooById(id);
}

@存储库
公共类MooRepository扩展了JpaRepository{
公共Moo findMooById(id);
}
问题:

当我调用findMooById时,我得到一个错误:

org.database.util.DatabaseException:错误:列bla.dtype不存在 存在

我知道这是因为hibernate正在搜索鉴别器列

问题

我的问题是,为什么hibernate要搜索鉴别器列

每个存储库的返回类型已经指定了Moo或Foo返回类型。如果Moo存储库愿意,它无法返回Foo


不应该要求鉴别器来做决定,对吗

如果您使用单表策略(或仅使用
@heritation
而不指定策略,即返回默认值-简单表-),则根据JPA规范第2.12节,鉴别器列是必需的


虽然可以在某些JPA实现中加载实体而不指定鉴别器列,但这样做并不能保证JPA实现之间的可移植性。

@query
中使用的查询投影应与条形实体的属性匹配。问题可能与投影和实体成员的不匹配有关。你能同时提供你的
@Query
吗?抱歉-我已经更新了问题,以便更好地反映情况。您是说查询投影应该只使用Bar超类的属性进行查询吗?我的查询是“从moo moo中选择moo,其中moo.property=:property”签出。显然,当您不指定继承策略时,将应用单表策略。我根本没有使用@Inheritation注释。那么您如何指定Inherenence策略呢?u plz是否可以发布Foo、Moo和Bar类代码以及映射文件(如果有)
@Repository
public class MooRepository extends JpaRepository<Moo, Long> {
    public Moo findMooById(id);
}