Commons DbUtils
  1. Commons DbUtils
  2. DBUTILS-57

BeanProcessor not able to map an alias column from a HSQLDB query to the any bean properties

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 1.3
    • Labels:
      None
    • Environment:

      hsqldb-1.9.0-rc4 memory mode
      DBUtils 1.2

      Description

      Using a query with an alias, hsqldb engine doesn't populate the column name metadata only the column label metadata.

      In such a case the column isn't mapped.

      To resolve this, the column label should be used in case the column name is not available.

      Here is a snippet from org.apache.commons.dbutils.BeanProcessor.mapColumnsToProperties line 393 :

      ...
      for (int col = 1; col <= cols; col++) {
      String columnName = rsmd.getColumnName(col);

      // columnName is empty, revert to column label
      if (columnName.length() == 0)

      { columnName = rsmd.getColumnLabel(col); }


      ...

      1. BeanProcessorTest.patch
        2 kB
        Julien Aymé
      2. BeanProcessor.patch
        0.7 kB
        Julien Aymé

        Activity

        Hide
        Dan Fabulich added a comment -

        Note that unlike Wynand's suggestion, Julien's patch prefers to use column label, falling back to column name if column label is not available.

        Show
        Dan Fabulich added a comment - Note that unlike Wynand's suggestion, Julien's patch prefers to use column label, falling back to column name if column label is not available.
        Hide
        Dan Fabulich added a comment -

        Committed revision 832535. Thanks for the patch!

        Show
        Dan Fabulich added a comment - Committed revision 832535. Thanks for the patch!
        Hide
        Julien Aymé added a comment -

        Attaching patch for BeanProcessor and unit test.

        Show
        Julien Aymé added a comment - Attaching patch for BeanProcessor and unit test.
        Hide
        Julien Aymé added a comment -

        This request is coherent to what has been done into the last BeanUtils release: see issue BEANUTILS-344.

        Show
        Julien Aymé added a comment - This request is coherent to what has been done into the last BeanUtils release: see issue BEANUTILS-344 .
        Hide
        wynand added a comment -

        Right.

        It seems then the actual problem lies with HSQLDB's getLabel() method.

        Show
        wynand added a comment - Right. It seems then the actual problem lies with HSQLDB's getLabel() method.
        Hide
        Julien Aymé added a comment -

        From the javadoc description of the getColumnLabel method (see http://java.sun.com/javase/6/docs/api/java/sql/ResultSetMetaData.html#getColumnLabel%28int%29 )

        "Gets the designated column's suggested title for use in printouts and displays. The suggested title is usually specified by the SQL AS clause. If a SQL AS is not specified, the value returned from getColumnLabel will be the same as the value returned by the getColumnName method."

        Show
        Julien Aymé added a comment - From the javadoc description of the getColumnLabel method (see http://java.sun.com/javase/6/docs/api/java/sql/ResultSetMetaData.html#getColumnLabel%28int%29 ) "Gets the designated column's suggested title for use in printouts and displays. The suggested title is usually specified by the SQL AS clause. If a SQL AS is not specified, the value returned from getColumnLabel will be the same as the value returned by the getColumnName method."
        Hide
        Julien Aymé added a comment -

        IMHO, the column label should be used in the first place, and reverted to the column name if the label is null or empty.
        This would allow to automatically map query like this:

        SELECT 
            i.id,
            i.price,
            t1.label AS name,
            t2.label AS description,
            t3.label AS tooltip
        FROM items i
            JOIN texts t1 ON i.lname_id = t1.id
            JOIN texts t2 ON i.ldescr_id = t2.id
            JOIN texts t3 ON i.ltool_id = t3.id
        WHERE i.id = ?
            AND t1.lang_id = ?
            AND t2.lang_id = ?
            AND t3.lang_id =?
        

        What do you think?

        Show
        Julien Aymé added a comment - IMHO, the column label should be used in the first place, and reverted to the column name if the label is null or empty. This would allow to automatically map query like this: SELECT i.id, i.price, t1.label AS name, t2.label AS description, t3.label AS tooltip FROM items i JOIN texts t1 ON i.lname_id = t1.id JOIN texts t2 ON i.ldescr_id = t2.id JOIN texts t3 ON i.ltool_id = t3.id WHERE i.id = ? AND t1.lang_id = ? AND t2.lang_id = ? AND t3.lang_id =? What do you think?

          People

          • Assignee:
            Unassigned
            Reporter:
            Wynand
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development