Skip to content

Commit d964368

Browse files
committed
Allow join from embedded element of collection, to a 1-1 non-embedded
object. For #138
1 parent 5cc0991 commit d964368

File tree

1 file changed

+32
-2
lines changed

1 file changed

+32
-2
lines changed

src/main/java/org/datanucleus/store/rdbms/query/QueryToSQLMapper.java

+32-2
Original file line numberDiff line numberDiff line change
@@ -1395,11 +1395,26 @@ else if (joinedExpr instanceof DyadicExpression && joinedExpr.getOperator() == E
13951395

13961396
if (mmd.isEmbedded())
13971397
{
1398+
// Embedded into the same table as before, so no join needed
13981399
otherMapping = sqlTbl.getTable().getMemberMapping(mmd);
13991400
}
14001401
else
14011402
{
1402-
otherMapping = sqlTbl.getTable().getMemberMapping(mmd);
1403+
if (sqlTbl.getTable() instanceof CollectionTable)
1404+
{
1405+
// Currently in a join table, so work from the element and this being an embedded member
1406+
CollectionTable collTbl = (CollectionTable)sqlTbl.getTable();
1407+
JavaTypeMapping elemMapping = collTbl.getElementMapping();
1408+
if (elemMapping instanceof EmbeddedMapping)
1409+
{
1410+
otherMapping = ((EmbeddedMapping)elemMapping).getJavaTypeMapping(mmd.getName());
1411+
}
1412+
}
1413+
else
1414+
{
1415+
otherMapping = sqlTbl.getTable().getMemberMapping(mmd);
1416+
}
1417+
14031418
relTable = storeMgr.getDatastoreClass(mmd.getTypeName(), clr);
14041419
if (otherMapping == null && previousMapping != null)
14051420
{
@@ -1494,6 +1509,7 @@ else if (relationType == RelationType.ONE_TO_ONE_BI)
14941509

14951510
if (mmd.isEmbedded())
14961511
{
1512+
// Embedded into the same table as before, so no join needed
14971513
otherMapping = sqlTbl.getTable().getMemberMapping(mmd);
14981514
}
14991515
else
@@ -1507,7 +1523,21 @@ else if (relationType == RelationType.ONE_TO_ONE_BI)
15071523
}
15081524
else
15091525
{
1510-
otherMapping = sqlTbl.getTable().getMemberMapping(mmd);
1526+
if (sqlTbl.getTable() instanceof CollectionTable)
1527+
{
1528+
// Currently in a join table, so work from the element and this being an embedded member
1529+
CollectionTable collTbl = (CollectionTable)sqlTbl.getTable();
1530+
JavaTypeMapping elemMapping = collTbl.getElementMapping();
1531+
if (elemMapping instanceof EmbeddedMapping)
1532+
{
1533+
otherMapping = ((EmbeddedMapping)elemMapping).getJavaTypeMapping(mmd.getName());
1534+
}
1535+
}
1536+
else
1537+
{
1538+
otherMapping = sqlTbl.getTable().getMemberMapping(mmd);
1539+
}
1540+
15111541
if (otherMapping == null && previousMapping != null)
15121542
{
15131543
if (previousMapping instanceof EmbeddedMapping)

0 commit comments

Comments
 (0)