【问题标题】:Hibernate nested one-to-many associationsHibernate 嵌套的一对多关联
【发布时间】:2015-05-28 14:53:49
【问题描述】:

我的 Polygon、LineString、Point 类具有以下关联:

  • Polygon - LineString 是一对多的关系(例如,polygon.getLineStrings())
  • LineString - 点是一对多的关系(例如 lineString.getPoints())

我想检索与多边形相关的所有数据:它的值类型、它的 LineStrings 以及每个 LineString 的 Points。理想情况下,它应该使用 JOIN 获取策略在单个查询中完成。

考虑以下数据库夹具:

Polygon1
|-LineString1
  |-Point1
  |-Point2
  |-Point3
|-LineString2
  |-Point4
  |-Point5

以下查询正确检索 LineStrings。之后会为每个 LineString 检索点,但效率不高:

from Polygon as p join fetch p.lineStrings as l

以下查询检索到 5 个 LineStrings(与 Points 一样多),这是不正确的:

select Polygon as p join fetch p.lineStrings as l join fetch l.points

尽管如此,生成的查询似乎很好:

select polygonent0_.ID as ID1_23_0_, linestring2_.ID as ID1_14_1_, pointentit4_.ID as ID1_22_2_, polygonent0_.POLYGONID as POLYGONI2_23_0_, polygonent0_.POLYGONTYPE as POLYGONT3_23_0_, polygonent0_.POLYGONDESIGNATOR as POLYGOND4_23_0_, polygonent0_.POLYGONAREA as POLYGONA5_23_0_, polygonent0_.POLYGONCOLOUR as POLYGONC6_23_0_, linestring2_.LINESTRINGID as LINESTRI2_14_1_, linestring2_.LINESTRINGTYPE as LINESTRI3_14_1_, linestring2_.LINESTRINGDESIGNATOR as LINESTRI4_14_1_, linestring2_.LINESTRINGWIDTH as LINESTRI5_14_1_, linestring2_.LINESTRINGLENGTH as LINESTRI6_14_1_, linestring2_.LINESTRINGCOLOUR as LINESTRI7_14_1_, linestring1_.POLYGONIDREF as POLYGONI1_23_0__, linestring1_.LINESTRINGIDREF as LINESTRI2_24_0__, pointentit4_.POINTID as POINTID2_22_2_, pointentit4_.POINTTYPE as POINTTYP3_22_2_, pointentit4_.POINTDESIGNATOR as POINTDES4_22_2_, pointentit4_.POINTNORTH as POINTNOR5_22_2_, pointentit4_.POINTEAST as POINTEAS6_22_2_, pointentit4_.POINTUP as POINTUP7_22_2_, pointentit4_.POINTCOLOUR as POINTCOL8_22_2_, pointentit4_.POINTHORIZONTALACCURACY as POINTHOR9_22_2_, pointentit4_.POINTVERTICALACCURACY as POINTVE10_22_2_, pointentit4_.FILENAME as FILENAM11_22_2_, pointentit4_.FILELENGTH as FILELEN12_22_2_, points3_.LINESTRINGIDREF as LINESTRI1_14_1__, points3_.POINTIDREF as POINTIDR2_15_1__, points3_.idx as idx3_1__ 
from POLYGON polygonent0_ 
inner join POLYGON_LINESTRING linestring1_ on polygonent0_.ID=linestring1_.POLYGONIDREF 
inner join LINESTRING linestring2_ on linestring1_.LINESTRINGIDREF=linestring2_.ID 
inner join LINESTRING_POINT points3_ on linestring2_.ID=points3_.LINESTRINGIDREF 
inner join POINT pointentit4_ on points3_.POINTIDREF=pointentit4_.ID 
where polygonent0_.ID=? 

非常感谢任何帮助。

【问题讨论】:

    标签: hibernate join one-to-many fetch


    【解决方案1】:

    乍一看,我发现您正在为多边形和点重复使用相同的别名“p”。你能给他们不同的别名吗?

    【讨论】:

    • 感谢@ddalton 的关注
    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多