Index: main/java/org/exolab/castor/jdo/engine/SQLStatementLoad.java =================================================================== --- main/java/org/exolab/castor/jdo/engine/SQLStatementLoad.java (Revision 6885) +++ main/java/org/exolab/castor/jdo/engine/SQLStatementLoad.java (Arbeitskopie) @@ -24,10 +24,12 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.Vector; import org.apache.commons.logging.Log; @@ -132,12 +134,13 @@ if (!alias.equals(aliasOld) && !field.isJoined()) { JDOClassDescriptor classDescriptor = (JDOClassDescriptor) field.getFieldDescriptor().getContainingClassDescriptor(); - String[] identities = SQLHelper.getIdentitySQLNames(classDescriptor); - for (int j = 0; j < identities.length; j++) { - boolean isTableNameAlreadyAdded = identitiesUsedForTable.containsKey(classDescriptor.getTableName()); - if (!isTableNameAlreadyAdded) { + boolean isTableNameAlreadyAdded = identitiesUsedForTable.containsKey(classDescriptor.getTableName()); + if (!isTableNameAlreadyAdded) { + String[] identities = SQLHelper.getIdentitySQLNames(classDescriptor); + for (int j = 0; j < identities.length; j++) { expr.addColumn(alias, identities[j]); } + identitiesUsedForTable.put(classDescriptor.getTableName(), Boolean.TRUE); } } @@ -326,18 +329,22 @@ // the identity columns int columnIndex = ids.length + 1; + Set processedTables = new HashSet(); + if (fields[0].isJoined()) { + processedTables.add(_engine.getDescriptor().getTableName()); + } + boolean notNull; // index in fields[] for storing result of SQLTypes.getObject() - boolean notNull; fieldIndex = 1; String tableName = null; - String tableNameOld = tableName; for (int i = 0 ; i < fields.length ; ++i) { SQLFieldInfo field = fields[i]; SQLColumnInfo[] columns = field.getColumnInfo(); tableName = field.getTableName(); - if ((i > 0) && !tableName.equals(tableNameOld) && !field.isJoined()) { - columnIndex = columnIndex + ids.length; + if (i>0 && !field.isJoined() && !processedTables.contains(tableName)) { + columnIndex = columnIndex + ids.length; } + processedTables.add(tableName); if (!field.isJoined() && (field.getJoinFields() == null)) { entity.setField(columns[0].toJava(SQLTypeInfos.getValue(rs, columnIndex++, columns[0].getSqlType())), i); @@ -364,24 +371,24 @@ if (notNull) { res.add(new Identity(id)); } entity.setField(res, i); } - - tableNameOld = tableName; } while (rs.next()) { fieldIndex = 1; columnIndex = ids.length + 1; + processedTables.clear(); + if (fields[0].isJoined()) { + processedTables.add(_engine.getDescriptor().getTableName()); + } - tableName = null; - tableNameOld = tableName; - for (int i = 0; i < fields.length ; ++i) { SQLFieldInfo field = fields[i]; SQLColumnInfo[] columns = field.getColumnInfo(); tableName = field.getTableName(); - if ((i > 0) && !tableName.equals(tableNameOld) && !field.isJoined()) { + if (i > 0 && !field.isJoined() && !processedTables.contains(tableName)) { columnIndex = columnIndex + ids.length; } + processedTables.add(tableName); if (field.isMulti()) { ArrayList res = (ArrayList) entity.getField(i); @@ -401,8 +408,6 @@ fieldIndex++; columnIndex += columns.length; } - - tableNameOld = tableName; } } } catch (SQLException except) {