User: kvvinaymenon
Date: 01/05/04 11:58:33
Modified: src/main/org/jboss/ejb/plugins/jaws/jdbc
JDBCDefinedFinderCommand.java
Log:
Fix for supporting composite primary keys in joins in finder methods for entity
beans. The table name was not being prefixed to all the primary key columns causing
ambiguous column references. The updated code now prefixes the table name for all the
columns.
Revision Changes Path
1.12 +68 -25
jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCDefinedFinderCommand.java
Index: JDBCDefinedFinderCommand.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCDefinedFinderCommand.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- JDBCDefinedFinderCommand.java 2001/02/09 10:34:39 1.11
+++ JDBCDefinedFinderCommand.java 2001/05/04 18:58:33 1.12
@@ -26,29 +26,29 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Joe Shevland</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Michel de Groot</a>
- * @version $Revision: 1.11 $
+ * @version $Revision: 1.12 $
*/
public class JDBCDefinedFinderCommand extends JDBCFinderCommand
{
// Attributes ----------------------------------------------------
-
+
private int[] parameterArray;
private TypeMappingMetaData typeMapping;
-
+
// Constructors --------------------------------------------------
-
+
public JDBCDefinedFinderCommand(JDBCCommandFactory factory, FinderMetaData f)
{
super(factory, f.getName());
typeMapping = jawsEntity.getJawsApplication().getTypeMapping();
-
+
// Replace placeholders with ?, but only if query is defined
String query = "";
ArrayList parameters = new ArrayList();
if (f.getQuery() != null) {
StringTokenizer finderQuery = new StringTokenizer(f.getQuery(),"{}",
true);
-
+
while (finderQuery.hasMoreTokens())
{
String t = finderQuery.nextToken();
@@ -61,13 +61,13 @@
} else
query += t;
}
- }
-
+ }
+
// Copy index numbers to parameterArray
parameterArray = new int[parameters.size()];
for (int i = 0; i < parameterArray.length; i++)
parameterArray[i] = ((Integer)parameters.get(i)).intValue();
-
+
// Since the fields in order clause also will form the select clause together
with
// the pk field list, we have to clean the order clause from ASC/DESC's and
fields
// that already are within the pk list
@@ -84,13 +84,13 @@
orderToken = orderTokens.nextToken().trim();
//Get rid of ASC's
int i = orderToken.toUpperCase().indexOf(" ASC");
- if(i!=-1)
+ if(i!=-1)
checkedOrderTokens[ix] = orderToken.substring(0, i).trim();
else
{
//Get rid of DESC's
i = orderToken.toUpperCase().indexOf(" DESC");
- if(i!=-1)
+ if(i!=-1)
checkedOrderTokens[ix] = orderToken.substring(0, i).trim();
else
{
@@ -100,7 +100,7 @@
}
ix++;
}
-
+
//Next step is to make up a Set of all pk tokens
StringTokenizer pkTokens = new StringTokenizer(getPkColumnList(), ",");
Set setOfPkTokens = new HashSet(pkTokens.countTokens());
@@ -108,7 +108,7 @@
{
setOfPkTokens.add(pkTokens.nextToken().trim());
}
-
+
//Now is the time to check for duplicates between pk and order tokens
int i = 0;
while(i < checkedOrderTokens.length)
@@ -120,7 +120,7 @@
}
i++;
}
-
+
//Ok, build a new order string that we can use later on
StringBuffer orderTokensToUse = new StringBuffer("");
i = 0;
@@ -140,16 +140,59 @@
// Construct SQL
// In case of join query:
// order must explicitly identify tablename.field to order on
- // query must start with "INNER JOIN <table to join with> WHERE
+ // query must start with "INNER JOIN <table to join with> WHERE
// <regular query with fully identified fields>"
String sql = null;
if (query.toLowerCase().startsWith(",")) {
- sql = "SELECT " + jawsEntity.getTableName()+"."+getPkColumnList() +
strippedOrder +
- " FROM " + jawsEntity.getTableName() + " " + query;
- } else
+ //Modified by Vinay Menon
+ StringBuffer sqlBuffer = new StringBuffer();
+
+ sqlBuffer.append("SELECT ");
+
+ String primaryKeyList = getPkColumnList();
+ String tableName = jawsEntity.getTableName();
+ StringTokenizer stok = new StringTokenizer(primaryKeyList,",");
+
+ while(stok.hasMoreTokens()){
+ sqlBuffer.append(tableName);
+ sqlBuffer.append(".");
+ sqlBuffer.append(stok.nextElement().toString());
+ sqlBuffer.append(",");
+ }
+
+ sqlBuffer.setLength(sqlBuffer.length()-1);
+ sqlBuffer.append(strippedOrder);
+ sqlBuffer.append(" FROM ");
+ sqlBuffer.append(jawsEntity.getTableName());
+ sqlBuffer.append(" ");
+ sqlBuffer.append(query);
+
+ sql = sqlBuffer.toString();
+ } else
if (query.toLowerCase().startsWith("inner join")) {
- sql = "SELECT " + jawsEntity.getTableName()+"."+getPkColumnList() +
strippedOrder +
- " FROM " + jawsEntity.getTableName() + " " + query;
+ StringBuffer sqlBuffer = new StringBuffer();
+
+ sqlBuffer.append("SELECT ");
+
+ String primaryKeyList = getPkColumnList();
+ String tableName = jawsEntity.getTableName();
+ StringTokenizer stok = new StringTokenizer(primaryKeyList,",");
+
+ while(stok.hasMoreTokens()){
+ sqlBuffer.append(tableName);
+ sqlBuffer.append(".");
+ sqlBuffer.append(stok.nextElement().toString());
+ sqlBuffer.append(",");
+ }
+
+ sqlBuffer.setLength(sqlBuffer.length()-1);
+ sqlBuffer.append(strippedOrder);
+ sqlBuffer.append(" FROM ");
+ sqlBuffer.append(jawsEntity.getTableName());
+ sqlBuffer.append(" ");
+ sqlBuffer.append(query);
+
+ sql = sqlBuffer.toString();
} else {
// regular query; check if query is empty,
// if so, this is a select all and WHERE should not be used
@@ -165,17 +208,17 @@
{
sql += " ORDER BY "+f.getOrder();
}
-
+
setSQL(sql);
}
-
+
// JDBCFinderCommand overrides ------------------------------------
-
- protected void setParameters(PreparedStatement stmt, Object argOrArgs)
+
+ protected void setParameters(PreparedStatement stmt, Object argOrArgs)
throws Exception
{
Object[] args = (Object[])argOrArgs;
-
+
for (int i = 0; i < parameterArray.length; i++)
{
Object arg = args[parameterArray[i]];
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-development