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

Reply via email to