Search code examples
javajdbcintrospectionapache-commons-beanutilsbug-reporting

Bug in Beanutils' ResultSetDynaSet?


I found recently, that JDBC has two ways to name column, i.e. "by name" and "by label", while apparently "by label" way is default.

Actually, column name notion is appear to be confusing for me. And probably not only for me, but for Beanutils autors, because they access fields by name by defaults (resulting in inability to access any query with column aliases). Simultaneously they have property useColumnLabel, which has no effect because it is set after introspection.

Here is the sample code

import org.apache.commons.beanutils.*;

import java.lang.reflect.InvocationTargetException;
import java.sql.*;
import java.util.ArrayList;
import java.util.Iterator;

public class ResultSetIteratorAttempt {


   public static void main(String[] args) throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {

      Connection conn = null;
      Statement stmt = null;

      Class.forName("com.mysql.jdbc.Driver");

      conn = DriverManager.getConnection("jdbc:mysql://localhost/sample","java","");

      stmt = conn.createStatement();

      ResultSet rs = stmt.executeQuery("SELECT Id as NM1, Name as NM2 FROM DayOfWeek;");

      ArrayList results = new ArrayList(); // To hold copied list

      ResultSetDynaClass rsdc = new ResultSetDynaClass(rs);
      rsdc.setUseColumnLabel(true);

      DynaProperty[] properties = rsdc.getDynaProperties();
      String propertyName = "";
      for(int i=0; i<properties.length; ++i) {
         propertyName = properties[i].getName();
         System.out.println(String.format("Property #%d is %s", i, propertyName));
      }

      Iterator rows = rsdc.iterator();
      DynaBean row;
      while (rows.hasNext()) {
         row = (DynaBean) rows.next();
         System.out.println(String.format("Row is %s", row.get(propertyName)));
      }

   }

}

Am I right?

UDPATE

mysql> select * from dayofweek;
+----+-----------+
| Id | Name      |
+----+-----------+
|  5 | Friday    |
|  1 | Monday    |
|  6 | Saturday  |
|  7 | Sunday    |
|  4 | Thursday  |
|  2 | Tuesday   |
|  3 | Wednesday |
+----+-----------+
7 rows in set (0.00 sec)

Solution

  • Bug is known https://issues.apache.org/jira/browse/BEANUTILS-383

    Workaround it to use alternative constructor signature, which is accepting three parameters.