【发布时间】: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