如何使用条件连接没有Hibernate定义关系的表?

时间:2015-04-17 03:21:23

标签: java hibernate hibernate-criteria

我正在尝试使用Hibernate标准来执行连接(从两个表返回数据),其中HBM.XML配置中没有定义关系。没有定义任何关系,因为我正在尝试创建一个指向许多不同表的“通用”关系表。假设我有两种类型的'父'对象,ParentType1和ParentType2。这些父母中的每一个都可以有多个孩子类型的列表,ChildType1,ChildType2等。

class ParentType1 {
    int P1ID;
    attributes ...
}

 class ParentType2 {
     int P2ID;
     attributes ...
 }

 class ChildType1 {
     int C1ID;
     attributes ...
 }
 etc . . .

实际的子OBJECTS可以与多个父项相关,因此我首先创建了一个关系表/对象,每种类型的子对象:

class ChildType1_Rel {
    String parentType;
    int    parentId;
    String relationType;
    int    childId;
}

class ChildType2_Rel {
    String parentType;
    int    parentId;
    String relationType;
    int    childId;
}
etc . . .

但后来我想为什么我需要为每种类型的孩子都需要新的关系对象和新表,所以我创建了一个通用的关系表

class Children_Rel {
    String parentType;
    int    parentId;
    String relationType;
    String childType;
    int    childId;
}

在第一个多关系表的情况下,我可以创建从ChildType1_Rel表到ChildType1表的多对多关系,并将ChildType2_Rel表创建为ChildType2,因为我知道要加入的对象。但是,在Children_Rel中,我不这样做,因为子类型在该关系的列值中。我认为可能存在某种类型的条件HBM.XML映射语法,它会根据列中的值映射对象,但没有找到任何内容。

鉴于我的应用程序,我不能同时检索与父项相关的所有数据,因此我不想要在HBM.XML中定义多对多关系。原因是'子'数据显示在需要使用远程分页的Infragistics GRID中,因此一旦我有父ID,网格就会调用servlet来获取每种类型的子数据。所以我的servlet查询看起来像这样:

SELECT * FROM Children_Rel CR, ChildType1 C 
  WHERE CR.parentType = 'Parent1'
    AND CR.parentId = X 
    AND CR.childType = 'ChildType1' 
    AND CR.childId = C.childId

我的问题是: 1)这种模型是否有意义或是否使事情变得更加困难? 2)我如何在标准中建模SQL?它并不是那么复杂,但我无法弄清楚如何连接没有hibernate定义关系的表。我也没有看到如何从Hibernate中取回2个独立的对象。

感谢您的帮助。

0 个答案:

没有答案