首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >涉及继承的映射的Hibernate查询条件

涉及继承的映射的Hibernate查询条件
EN

Stack Overflow用户
提问于 2012-07-05 00:24:36
回答 2查看 2.9K关注 0票数 0

假设类'X‘映射到表'X’类,'A‘类映射到表'A’,类'B‘映射到表'B’。

表X结构:( X_Id,其他列表A结构:( A_Id,X_Id,一些其他列)表B结构:(A_Id,一些其他列)...Table B也有A_Id

类'B‘扩展了类’A‘。我们有两个类的映射文件:

类'A‘父映射文件:

代码语言:javascript
复制
@Entity
@Table(name = 'A')
@Inheritance(stratergy=InheritanceType.Joined)
public abstract class A {
@Id @Clumns(name = "A_Id)
@GeneratedValue
protected Long aId;
-- some more A specific fields
}

类“B”映射文件:

代码语言:javascript
复制
@Entity
@Table(name= 'B')
Public class B extends A{
---- B specific fields
}

现在,我有一个SQL查询,如下所示,我需要使用hibernate标准API编写。

代码语言:javascript
复制
select * from X
INNER JOIN A 
ON X.id = A.id
INNER JOIN B
ON A.id = B.id
where B.name = 'XYZ'
   and B.Sex = 'M'

我想出了:

代码语言:javascript
复制
Criteria c = session.createCriteria(x.class, "x");
                    .createAlias("x.a", "a")
                    .createAlias("a.b", "b")          
                    .add(Restrictions.eq("b.sex", "M"))
                    .add(Restrictions.eq("b.name", "XYZ"));

但是,如果我们检查映射文件,A中没有直接引用B,因此hibernate抛出了"B与A无关“的实体。

是否有任何方法可以将此继承映射到查询can中?

EN

Stack Overflow用户

发布于 2012-07-05 00:35:09

您不应该在您的标准中引用A,或者使用任何别名。

代码语言:javascript
复制
Criteria c = session.createCriteria(B.class);
                    .add(Restrictions.eq("sex", "M"))
                    .add(Restrictions.eq("name", "XYZ"));

会给你你想要的结果。

因为有了InheritanceType.Joined,这可能会产生包含到A表的联接(类似于您显示的SQL的内容)的sql,但是没有必要在条件中指定这个联接。

条件中类似于列的内容实际上是对Java对象中字段的(反射)引用。Hibernate从您的注释中找出要放入sql的列,如果需要的话,应该根据继承注释将它连接到A表。

为了在您的上下文中确定这一点,并更好地理解这一切,我建议尝试一下,并打开this answer中描述的生成sql的日志记录,以解决另一个非常hibernate的问题。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11336611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档