当前位置: 首页 > 面试题库 >

具有继承性的JPA本机查询实体

吕飞翼
2023-03-14
问题内容

我有一个实体类和一个基于该实体的子类:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class A

@Entity
public class B extends A

我需要发出仅在基类(A)上使用存储过程的本机查询。如果我尝试如下:

entityManager.createNativeQuery("select * from A a where procedure(f)",A.class).getResultList()

我收到有关“在ResultSet中未找到clazz_列”的错误。我假设JPA提供程序添加了此列,以便区分基类和扩展类。我可以通过显式添加clazz列和子类中的所有字段来解决此问题:

entityManager.createNativeQuery("select *,1 as clazz_,null as prop1,null as prop2 from A a where procedure(f)",A.class).getResultList()

其中“ prop1”和“ prop2”是子类B的属性。但是,这似乎是不必要的修改,并且如果子类B发生更改,则容易出现维护问题。

我的问题是:如何在已定义继承的实体上使用存储过程查询?


问题答案:

正如您可能已经看到的那样,Hibernate团队在定义如何执行此方法方面并没有做很多工作。

16.1.6。处理继承

查询作为继承的一部分映射的实体的本机SQL查询必须包括基类及其所有子类的所有属性。

因此,如果您要使用本机查询,则看起来您像在做这样的事情。关于对子类B的更改的关注,实现此目的的一种较不繁琐的方法是尝试对共享ID属性使用LEFT OUTER
JOIN语法:

entityManager.createNativeQuery("select a.*, b*, 1 as clazz_, from A a LEFT OUTER JOIN B b on id = a.id where procedure(f)",A.class).getResultList()

这样,如果您添加或删除某些属性,您将始终从B获得所有属性。



 类似资料:
  • 问题内容: 我在通用表“ Sample”上构建查询,并且有几种类型从该表“ SampleOne”,“ SampleTwo”继承。我需要类似的查询: 其中type是表的鉴别值。是否可以通过任何方式(并且避免创建实体特定的查询,每个SampleOne,SampleTwo …等等) 我非常感谢您对本主题的任何投入, 亲切的问候,P。 问题答案: 在JPA 2.0中,您可以使用表达式(尽管当前它不适用于H

  • 我对JPA中的继承是新手。我不知道如何查询这样的内容: 让我们假设一个联接继承映射,其中a是一个具有'id'和'name'的实体。还有从A继承的实体A1和A2。A1提供字段'int1',A2提供字段'int2'

  • 我有一个用JPA映射的简单类: 我把那门课扩展成了非常简单的课 这正是我对SponsorDefainableBo所需要的。它是Sponsor的副本,并且从与Sponsor相同的表中读取。这是我们通过一些xml文档控制的查询框架所需要的,并且需要成为我正在做的事情的单独对象。需要SponsorDefainableBo插入查询/维护框架以进行我们不想在主父文档中进行的自定义详细信息。当我尝试使用Spo

  • 我很难启动服务器,因为它抱怨在查询中找不到继承的属性。 我的问题是,既然我试图将它移动到继承模型(联接),我如何在带注释的查询中引用继承的属性? (注意,该属性是私有可见性,在BaseContent中使用public getter/setter) 谢谢。

  • 我是JPA新手。目前,我正在编写一个带有注释的本机查询。我有一个类似下面的类 我正在编写两个查询,其中一个查询在选择投影中包含字段2,而另一个不包含字段2。如何对这两个查询使用相同的类?我尝试了瞬态注释。但它使两个查询的值都为null。

  • 我有4个实体: ,,, 和4个表: 现在我想在一个查询中选择所有有课程的用户(如果存在的话)(注意用户没有课程)这个select生成如下所示: 您可以清楚地看到,Hibernate没有与t_student_course表连接 我正在使用Hibernate 4.1 Final 问题:Hibernate支持这样的查询吗 a)如果支持,那么为什么它不为实体获取课程? b)如果不支持,我如何选择所有的用户