[jboss-cvs] JBossAS SVN: r58402 - in trunk/server/src/main/org/jboss/ejb/plugins/cmp: jdbc jdbc/bridge jdbc2 jdbc2/bridge jdbc2/schema
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Wed Nov 15 10:00:51 EST 2006
Author: alex.loubyansky at jboss.com
Date: 2006-11-15 10:00:39 -0500 (Wed, 15 Nov 2006)
New Revision: 58402
Modified:
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/EJBQLToSQL92Compiler.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCDynamicQLQuery.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCEJBQLCompiler.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCEJBQLQuery.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCJBossQLQuery.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCType.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCTypeComplex.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCTypeSimple.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/QLCompiler.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/SQLUtil.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/bridge/JDBCCMRFieldBridge.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/AbstractQueryCommand.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/DeclaredSQLQueryCommand.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/DynamicQueryCommand.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/EJBQLQueryCommand.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/FindByPrimaryKeyCommand.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/JBossQLQueryCommand.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/bridge/JDBCCMRFieldBridge2.java
trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/schema/EntityTable.java
Log:
JBAS-3800 EJBQLToSQL92Compiler should use only searchable columns with DISTINCT
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/EJBQLToSQL92Compiler.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/EJBQLToSQL92Compiler.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/EJBQLToSQL92Compiler.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -84,6 +84,7 @@
private StringBuffer onFindCMRJoin;
private boolean countCompositePk;
+ private boolean selectDistinct;
public EJBQLToSQL92Compiler(Catalog catalog)
{
@@ -243,6 +244,11 @@
return leftJoinCMRList;
}
+ public boolean isSelectDistinct()
+ {
+ return selectDistinct;
+ }
+
public Object visit(SimpleNode node, Object data)
{
throw new RuntimeException("Internal error: Found unknown node type in " +
@@ -300,6 +306,8 @@
}
}
+ selectDistinct = ((ASTSelect) selectNode).distinct || returnType == Set.class || forceDistinct;
+
// assemble sql
StringBuffer sql = (StringBuffer) data;
if(selectManager.getMetaData().hasRowLocking() && !(selectObject instanceof SelectFunction))
@@ -310,7 +318,7 @@
throw new IllegalStateException("Row locking template is not defined for given mapping: " + typeMapping.getName());
}
- boolean distinct = ((ASTSelect) selectNode).distinct || returnType == Set.class || forceDistinct;
+ boolean distinct = selectDistinct;
Object args[] = new Object[]{
distinct ? SQLUtil.DISTINCT + selectClause : selectClause.toString(),
@@ -323,7 +331,7 @@
else
{
sql.append(SQLUtil.SELECT);
- if(((ASTSelect) selectNode).distinct || returnType == Set.class || forceDistinct)
+ if(selectDistinct)
{
sql.append(SQLUtil.DISTINCT);
}
@@ -455,9 +463,14 @@
setTypeFactory(selectEntity.getManager().getJDBCTypeFactory());
final String alias = aliasManager.getAlias(path.getPath());
- SQLUtil.getColumnNamesClause(selectEntity.getTableFields(),
- alias,
- sql);
+ if(select.distinct)
+ {
+ SQLUtil.getSearchableColumnNamesClause(selectEntity.getTableFields(), alias, sql);
+ }
+ else
+ {
+ SQLUtil.getColumnNamesClause(selectEntity.getTableFields(), alias, sql);
+ }
/*
if(readAhead.isOnFind())
@@ -1547,5 +1560,6 @@
joinPaths.clear();
identifierToTable.clear();
joinedAliases.clear();
+ selectDistinct = false;
}
}
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCDynamicQLQuery.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCDynamicQLQuery.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCDynamicQLQuery.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -35,6 +35,7 @@
import org.jboss.ejb.plugins.cmp.ejbql.SelectFunction;
import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCEntityBridge;
import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMPFieldBridge;
+import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCFieldBridge;
import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCQueryMetaData;
import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCDynamicQLQueryMetaData;
import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCReadAheadMetaData;
@@ -141,6 +142,19 @@
{
mask = selectEntity.getLoadGroupMask(readahead.getEagerLoadGroup());
leftJoinCMRList = compiler.getLeftJoinCMRList();
+
+ // exclude non-searchable columns if distinct is used
+ if(compiler.isSelectDistinct())
+ {
+ JDBCFieldBridge[] tableFields = selectEntity.getTableFields();
+ for(int i = 0; i < tableFields.length; ++i)
+ {
+ if(mask[i] && !tableFields[i].getJDBCType().isSearchable())
+ {
+ mask[i] = false;
+ }
+ }
+ }
}
else
{
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCEJBQLCompiler.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCEJBQLCompiler.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCEJBQLCompiler.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -137,6 +137,7 @@
private boolean countCompositePk;
private String selectAlias;
+ private boolean selectDistinct;
public JDBCEJBQLCompiler(Catalog catalog)
{
@@ -250,6 +251,7 @@
onFindCMRJoin = null;
countCompositePk = false;
selectAlias = null;
+ selectDistinct = false;
}
public String getSQL()
@@ -317,6 +319,11 @@
return leftJoinCMRList;
}
+ public boolean isSelectDistinct()
+ {
+ return selectDistinct;
+ }
+
public Object visit(SimpleNode node, Object data)
{
throw new RuntimeException("Internal error: Found unknown node type in " +
@@ -584,6 +591,8 @@
where.append(fromThetaJoin.toString());
}
+ selectDistinct = isDistinct(selectNode);
+
// select size
if(lazyResultSetLoading)
{
@@ -594,7 +603,7 @@
if(pkFields.length == 1)
{
buf.append('(').append(SQLUtil.SELECT).append("count(");
- if(isDistinct(selectNode))
+ if(selectDistinct)
{
buf.append(SQLUtil.DISTINCT);
}
@@ -614,7 +623,7 @@
.append('(')
.append(SQLUtil.SELECT);
- if(isDistinct(selectNode))
+ if(selectDistinct)
{
buf.append(SQLUtil.DISTINCT);
}
@@ -633,7 +642,7 @@
else if(isSelectField())
{
buf.append('(').append(SQLUtil.SELECT).append("count(");
- if(isDistinct(selectNode))
+ if(selectDistinct)
{
buf.append(SQLUtil.DISTINCT);
}
@@ -649,7 +658,7 @@
}
// distinct
- if(isDistinct(selectNode))
+ if(selectDistinct)
{
select.insert(0, SQLUtil.DISTINCT);
}
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCEJBQLQuery.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCEJBQLQuery.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCEJBQLQuery.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -24,6 +24,7 @@
import org.jboss.deployment.DeploymentException;
import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCEntityBridge;
import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMPFieldBridge;
+import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCFieldBridge;
import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCQlQueryMetaData;
import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCQueryMetaData;
import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCReadAheadMetaData;
@@ -83,6 +84,20 @@
{
setEagerLoadGroup(readahead.getEagerLoadGroup());
setOnFindCMRList(compiler.getLeftJoinCMRList());
+
+ // exclude non-searchable columns if distinct is used
+ if(compiler.isSelectDistinct())
+ {
+ boolean[] mask = getEagerLoadMask();
+ JDBCFieldBridge[] tableFields = selectEntity.getTableFields();
+ for(int i = 0; i < tableFields.length; ++i)
+ {
+ if(mask[i] && !tableFields[i].getJDBCType().isSearchable())
+ {
+ mask[i] = false;
+ }
+ }
+ }
}
}
else if(compiler.isSelectField())
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCJBossQLQuery.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCJBossQLQuery.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCJBossQLQuery.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -87,6 +87,20 @@
{
setEagerLoadGroup(readahead.getEagerLoadGroup());
setOnFindCMRList(compiler.getLeftJoinCMRList());
+
+ // exclude non-searchable columns if distinct is used
+ if(compiler.isSelectDistinct())
+ {
+ boolean[] mask = getEagerLoadMask();
+ JDBCCMPFieldBridge[] tableFields = (JDBCCMPFieldBridge[])selectEntity.getTableFields();
+ for(int i = 0; i < tableFields.length; ++i)
+ {
+ if(mask[i] && !tableFields[i].getJDBCType().isSearchable())
+ {
+ mask[i] = false;
+ }
+ }
+ }
}
}
else if(compiler.isSelectField())
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCType.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCType.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCType.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -53,4 +53,6 @@
Object setColumnValue(int index, Object value, Object columnValue);
boolean hasMapper();
+
+ boolean isSearchable();
}
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCTypeComplex.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCTypeComplex.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCTypeComplex.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -118,6 +118,11 @@
return false;
}
+ public boolean isSearchable()
+ {
+ return false;
+ }
+
public JDBCResultSetReader[] getResultSetReaders()
{
return resultSetReaders;
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCTypeSimple.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCTypeSimple.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCTypeSimple.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -21,7 +21,9 @@
*/
package org.jboss.ejb.plugins.cmp.jdbc;
+import java.sql.Types;
+
/**
* This class provides a simple mapping of a Java type type to a single column.
*
@@ -118,6 +120,17 @@
return mapper != null;
}
+ public boolean isSearchable()
+ {
+ int jdbcType = jdbcTypes[0];
+ return jdbcType != Types.BINARY &&
+ jdbcType != Types.BLOB &&
+ jdbcType != Types.CLOB &&
+ jdbcType != Types.LONGVARBINARY &&
+ jdbcType != Types.LONGVARCHAR &&
+ jdbcType != Types.VARBINARY;
+ }
+
public final JDBCResultSetReader[] getResultSetReaders()
{
return resultSetReader;
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/QLCompiler.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/QLCompiler.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/QLCompiler.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -79,4 +79,6 @@
List getInputParameters();
List getLeftJoinCMRList();
+
+ boolean isSelectDistinct();
}
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/SQLUtil.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/SQLUtil.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/SQLUtil.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -315,6 +315,29 @@
/**
* Returns columnName0 [, columnName1 [AND columnName2 [...]]]
*/
+ public static StringBuffer getSearchableColumnNamesClause(JDBCFieldBridge[] fields,
+ String identifier,
+ StringBuffer buf)
+ {
+ boolean comma = false;
+ for(int i = 0; i < fields.length; ++i)
+ {
+ JDBCType type = getJDBCType(fields[i]);
+ if(type != null && type.isSearchable())
+ {
+ if(comma)
+ buf.append(COMMA);
+ else
+ comma = true;
+ getColumnNamesClause(type, identifier, buf);
+ }
+ }
+ return buf;
+ }
+
+ /**
+ * Returns columnName0 [, columnName1 [AND columnName2 [...]]]
+ */
public static StringBuffer getColumnNamesClause(JDBCEntityBridge.FieldIterator loadIter, StringBuffer sb)
{
if(loadIter.hasNext())
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/bridge/JDBCCMRFieldBridge.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/bridge/JDBCCMRFieldBridge.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc/bridge/JDBCCMRFieldBridge.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -2198,6 +2198,11 @@
throw new UnsupportedOperationException("hasMapper is not implemented.");
}
+ public boolean isSearchable()
+ {
+ throw new UnsupportedOperationException("isSearchable is not implemented.");
+ }
+
public JDBCResultSetReader[] getResultSetReaders()
{
// foreign key fields has their result set readers
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/AbstractQueryCommand.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/AbstractQueryCommand.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/AbstractQueryCommand.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -100,10 +100,10 @@
initCollectionStrategy();
}
- protected void setEntityReader(JDBCEntityBridge2 entity)
+ protected void setEntityReader(JDBCEntityBridge2 entity, boolean searchableOnly)
{
this.entity = entity;
- this.resultReader = new EntityReader(entity);
+ this.resultReader = new EntityReader(entity, searchableOnly);
initCollectionStrategy();
}
@@ -346,15 +346,17 @@
static class EntityReader implements ResultReader
{
private final JDBCEntityBridge2 entity;
+ private final boolean searchableOnly;
- public EntityReader(JDBCEntityBridge2 entity)
+ public EntityReader(JDBCEntityBridge2 entity, boolean searchableOnly)
{
this.entity = entity;
+ this.searchableOnly = searchableOnly;
}
public Object readRow(ResultSet rs, GenericEntityObjectFactory factory)
{
- final Object pk = entity.getTable().loadRow(rs);
+ final Object pk = entity.getTable().loadRow(rs, searchableOnly);
return pk == null ? null : factory.getEntityEJBObject(pk);
}
};
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/DeclaredSQLQueryCommand.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/DeclaredSQLQueryCommand.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/DeclaredSQLQueryCommand.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -80,7 +80,7 @@
String fieldName = metadata.getFieldName();
if(fieldName == null)
{
- setEntityReader(entity);
+ setEntityReader(entity, metadata.isSelectDistinct());
}
else
{
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/DynamicQueryCommand.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/DynamicQueryCommand.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/DynamicQueryCommand.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -113,7 +113,7 @@
}
else
{
- resultReader = new AbstractQueryCommand.EntityReader((JDBCEntityBridge2)compiler.getSelectEntity());
+ resultReader = new AbstractQueryCommand.EntityReader((JDBCEntityBridge2)compiler.getSelectEntity(), compiler.isSelectDistinct());
}
return AbstractQueryCommand.fetchCollection(
@@ -161,7 +161,7 @@
}
else
{
- resultReader = new AbstractQueryCommand.EntityReader((JDBCEntityBridge2)compiler.getSelectEntity());
+ resultReader = new AbstractQueryCommand.EntityReader((JDBCEntityBridge2)compiler.getSelectEntity(), compiler.isSelectDistinct());
}
return AbstractQueryCommand.fetchOne(entity, sql, toArray(compiler.getInputParameters()),
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/EJBQLQueryCommand.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/EJBQLQueryCommand.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/EJBQLQueryCommand.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -79,7 +79,7 @@
}
else
{
- setEntityReader((JDBCEntityBridge2)compiler.getSelectEntity());
+ setEntityReader((JDBCEntityBridge2)compiler.getSelectEntity(), compiler.isSelectDistinct());
}
}
}
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/FindByPrimaryKeyCommand.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/FindByPrimaryKeyCommand.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/FindByPrimaryKeyCommand.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -91,7 +91,7 @@
log.debug("sql: " + sql);
setParameters(QueryParameter.createPrimaryKeyParameters(0, entity));
- setEntityReader(entity);
+ setEntityReader(entity, false);
}
public Object fetchOne(Schema schema, GenericEntityObjectFactory factory, Object[] args) throws FinderException
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/JBossQLQueryCommand.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/JBossQLQueryCommand.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/JBossQLQueryCommand.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -78,7 +78,7 @@
}
else
{
- setEntityReader((JDBCEntityBridge2)compiler.getSelectEntity());
+ setEntityReader((JDBCEntityBridge2)compiler.getSelectEntity(), compiler.isSelectDistinct());
}
}
}
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/bridge/JDBCCMRFieldBridge2.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/bridge/JDBCCMRFieldBridge2.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/bridge/JDBCCMRFieldBridge2.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -1272,7 +1272,7 @@
while(rs.next())
{
- value = relatedTable.loadRow(rs);
+ value = relatedTable.loadRow(rs, false);
state.addLoadedPk(value);
}
}
@@ -1372,7 +1372,7 @@
while(rs.next())
{
- value = relatedTable.loadRow(rs);
+ value = relatedTable.loadRow(rs, false);
state.addLoadedPk(value);
}
}
Modified: trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/schema/EntityTable.java
===================================================================
--- trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/schema/EntityTable.java 2006-11-15 14:56:43 UTC (rev 58401)
+++ trunk/server/src/main/org/jboss/ejb/plugins/cmp/jdbc2/schema/EntityTable.java 2006-11-15 15:00:39 UTC (rev 58402)
@@ -80,6 +80,8 @@
private static final byte DELETED = 8;
private static final byte DIRTY_RELATIONS = 16;
+ private static final Object NOT_LOADED = new Object();
+
private JDBCEntityBridge2 entity;
private String tableName;
private int fieldsTotal;
@@ -447,19 +449,13 @@
return dataSource;
}
- public void loadRow(ResultSet rs, Object pk)
+ public Object loadRow(ResultSet rs, boolean searchableOnly)
{
View view = getView();
- view.loadRow(rs, pk);
- }
-
- public Object loadRow(ResultSet rs)
- {
- View view = getView();
Object pk = view.loadPk(rs);
if(pk != null)
{
- view.loadRow(rs, pk);
+ view.loadRow(rs, pk, searchableOnly);
}
else if(log.isTraceEnabled())
{
@@ -522,7 +518,7 @@
throw new NoSuchEntityException("Row not found: " + id);
}
- return view.loadRow(rs, id);
+ return view.loadRow(rs, id, false);
}
catch(SQLException e)
{
@@ -982,7 +978,7 @@
}
}
- public Row loadRow(ResultSet rs, Object pk)
+ public Row loadRow(ResultSet rs, Object pk, boolean searchableOnly)
{
Row row = getRowByPk(pk, false);
if(row != null)
@@ -1000,12 +996,21 @@
row = createCleanRow(pk);
JDBCCMPFieldBridge2[] tableFields = (JDBCCMPFieldBridge2[]) entity.getTableFields();
- //int rsInd = 1;
+ // this rsOffset is kind of a hack
+ // but since tableIndex and rowIndex of a field are the same
+ // this should work ok
+ int rsOffset = 1;
for(int i = 0; i < tableFields.length; ++i)
{
JDBCCMPFieldBridge2 field = tableFields[i];
- //Object columnValue = field.loadArgumentResults(rs, rsInd++);
- Object columnValue = field.loadArgumentResults(rs, field.getRowIndex() + 1);
+ if(searchableOnly && !field.getJDBCType().isSearchable())
+ {
+ row.fields[field.getRowIndex()] = NOT_LOADED;
+ --rsOffset;
+ continue;
+ }
+
+ Object columnValue = field.loadArgumentResults(rs, field.getRowIndex() + rsOffset);
row.fields[field.getRowIndex()] = columnValue;
if(field.getVersionIndex() != -1)
@@ -1448,7 +1453,14 @@
{
throw new NoSuchObjectLocalException("The instance was removed: " + pk);
}
- return fields[i];
+
+ Object value = fields[i];
+ if(value == NOT_LOADED)
+ {
+ value = loadField(i);
+ }
+
+ return value;
}
public void setFieldValue(int i, Object value)
@@ -1724,6 +1736,75 @@
JDBCUtil.safeClose(con);
}
}
+
+ private Object loadField(int i)
+ {
+ JDBCCMPFieldBridge2 field = (JDBCCMPFieldBridge2)entity.getFields().get(i);
+
+ StringBuffer query = new StringBuffer();
+ query.append("select ")
+ .append(field.getColumnName())
+ .append(" from ")
+ .append(tableName)
+ .append(" where ");
+
+ JDBCCMPFieldBridge2[] pkFields = (JDBCCMPFieldBridge2[])entity.getPrimaryKeyFields();
+ for(int pkI = 0; pkI < pkFields.length; ++pkI)
+ {
+ if(pkI > 0)
+ {
+ query.append(" and ");
+ }
+ query.append(pkFields[pkI].getColumnName()).append("=?");
+ }
+
+ if(log.isDebugEnabled())
+ {
+ log.debug("executing: " + query.toString());
+ }
+
+ Object value = null;
+ Connection con = null;
+ PreparedStatement ps = null;
+ ResultSet rs = null;
+
+ try
+ {
+ con = dataSource.getConnection();
+ ps = con.prepareStatement(query.toString());
+
+ for(int pkI = 0; pkI < pkFields.length; ++pkI)
+ {
+ JDBCCMPFieldBridge2 pkField = pkFields[pkI];
+ Object fieldValue = fields[pkField.getRowIndex()];
+ pkField.setArgumentParameters(ps, pkI + 1, fieldValue);
+ }
+
+ rs = ps.executeQuery();
+
+ if(!rs.next())
+ {
+ throw new NoSuchEntityException("Row not found: " + pk);
+ }
+
+ value = field.loadArgumentResults(rs, 1);
+ }
+ catch(SQLException e)
+ {
+ throw new EJBException("Failed to load field " +
+ entity.getEntityName() + "." + field.getFieldName() +
+ ": " + e.getMessage(), e);
+ }
+ finally
+ {
+ JDBCUtil.safeClose(rs);
+ JDBCUtil.safeClose(ps);
+ JDBCUtil.safeClose(con);
+ }
+
+ fields[field.getRowIndex()] = value;
+ return value;
+ }
}
public static interface CommitStrategy
More information about the jboss-cvs-commits
mailing list