code: @Override
    protected int[] mapColumnsToProperties(
        final ResultSetMetaData rsmd, final PropertyDescriptor[] props) throws SQLException {
  
      final int cols = rsmd.getColumnCount();
      final int[] columnToProperty = new int[cols + 1];
      Arrays.fill(columnToProperty, PROPERTY_NOT_FOUND);
  
      for (int col = 1; col <= cols; col++) {
        String columnName = rsmd.getColumnLabel(col);
  
        if (null == columnName || 0 == columnName.length()) {
          columnName = rsmd.getColumnName(col);
        }
  
        String overrideName = columnToFieldOverrides.get(columnName);
        if (overrideName == null) {
          overrideName = columnName;
        }
  
        final String generousColumnName = columnName.replace("_", "");
  
        for (int i = 0; i < props.length; i++) {
          final String propName = props[i].getName();
  
          // see if either the column name, or the generous one matches
          if (columnName.equalsIgnoreCase(propName)
              || generousColumnName.equalsIgnoreCase(propName)
              || overrideName.equalsIgnoreCase(propName)) {
            columnToProperty[col] = i;
            break;
          }
        }
      }
  
      return columnToProperty;
    }
docs: The positions in the returned array represent column numbers. The values stored at each
  position represent the index in the <code>PropertyDescriptor[]</code> for the bean property
  that matches the column name. Also tried to match snake case column names or overrides. If no
  bean property was found for a column, the position is set to <code>PROPERTY_NOT_FOUND</code>.
  
  @param rsmd The <code>ResultSetMetaData</code> containing column information.
  @param props The bean property descriptors.
  @throws SQLException if a database access error occurs
  @return An int[] with column index to property index mappings. The 0th element is meaningless
  because JDBC column indexing starts at 1.