2017-05-16 16:56:53 -04:00
package com.moparisthebest.jdbc ;
import com.moparisthebest.classgen.Compiler ;
2017-06-07 02:43:46 -04:00
import javax.lang.model.type.TypeMirror ;
2017-05-27 23:54:22 -04:00
import java.io.IOException ;
2017-05-16 16:56:53 -04:00
import java.lang.reflect.AccessibleObject ;
import java.lang.reflect.Field ;
import java.lang.reflect.Method ;
import java.sql.ResultSet ;
import java.sql.SQLException ;
import java.util.Calendar ;
import java.util.Map ;
/ * *
2017-05-17 11:18:58 -04:00
* Map a ResultSet row to an Object . This mapper generates / compiles / executes java code to perform the mapping .
*
* @author Travis Burtrum ( modifications from beehive )
* @author Travis Burtrum
* @see RowToObjectMapper for most details , will document here where this differs
* < p >
* Usage differences :
* 1 . Reflection can set non - public or final fields directly , direct java code cannot , so DTOs like that will result in
* a compilation and therefore mapping error .
2017-05-18 14:26:23 -04:00
* /
2017-05-17 17:32:48 -04:00
public class CompilingRowToObjectMapper < K , T > extends RowToObjectMapper < K , T > {
2017-05-18 14:26:23 -04:00
// do not remove, used from generated classes
2017-05-17 17:32:48 -04:00
public static final String firstColumnError = " Cannot call getFirstColumn when mapKeyType is null! " ;
2017-05-16 16:56:53 -04:00
protected final Compiler compiler ;
2017-05-17 17:32:48 -04:00
protected final ResultSetToObject < K , T > resultSetToObject ;
2017-05-16 16:56:53 -04:00
2017-05-17 17:32:48 -04:00
public CompilingRowToObjectMapper ( final Compiler compiler , final Map < CachingRowToObjectMapper . ResultSetKey , ResultSetToObject < ? , ? > > cache , ResultSet resultSet , Class < T > returnTypeClass , Calendar cal , Class < ? > mapValType , Class < K > mapKeyType ) {
2017-05-18 14:26:23 -04:00
this ( compiler , cache , resultSet , returnTypeClass , cal , mapValType , mapKeyType , false ) ;
}
public CompilingRowToObjectMapper ( final Compiler compiler , final Map < CachingRowToObjectMapper . ResultSetKey , ResultSetToObject < ? , ? > > cache , ResultSet resultSet , Class < T > returnTypeClass , Calendar cal , Class < ? > mapValType , Class < K > mapKeyType , final boolean caseInsensitiveMap ) {
super ( resultSet , returnTypeClass , cal , mapValType , mapKeyType , caseInsensitiveMap ) ;
2017-05-16 16:56:53 -04:00
this . compiler = compiler ;
try {
2017-05-17 17:32:48 -04:00
final CachingRowToObjectMapper . ResultSetKey keys = new CachingRowToObjectMapper . ResultSetKey ( super . getKeysFromResultSet ( ) , _returnTypeClass , _mapKeyType ) ;
2017-05-16 16:56:53 -04:00
//System.out.printf("keys: %s\n", keys);
@SuppressWarnings ( " unchecked " )
2017-05-17 17:32:48 -04:00
final ResultSetToObject < K , T > resultSetToObject = ( ResultSetToObject < K , T > ) cache . get ( keys ) ;
2017-05-16 16:56:53 -04:00
if ( resultSetToObject = = null ) {
//System.out.printf("cache miss, keys: %s\n", keys);
// generate and put into cache
cache . put ( keys , this . resultSetToObject = genClass ( ) ) ;
this . keys = null ;
this . _fields = null ;
this . _fieldTypes = null ;
2017-05-17 13:07:08 -04:00
this . constructor = null ;
2017-05-16 16:56:53 -04:00
} else {
//System.out.printf("cache hit, keys: %s\n", keys);
// load from cache
this . resultSetToObject = resultSetToObject ;
}
} catch ( SQLException e ) {
throw new MapperException ( " CachingRowToObjectMapper: SQLException: " + e . getMessage ( ) , e ) ;
2017-05-27 23:54:22 -04:00
} catch ( IOException e ) {
throw new MapperException ( " CachingRowToObjectMapper: IOException (should never happen?): " + e . getMessage ( ) , e ) ;
2017-05-16 16:56:53 -04:00
}
}
2017-05-27 23:54:22 -04:00
public CompilingRowToObjectMapper ( final String [ ] keys , Class < T > returnTypeClass , Calendar cal , Class < ? > mapValType , Class < K > mapKeyType ) {
super ( keys , null , returnTypeClass , cal , mapValType , mapKeyType , false ) ;
this . compiler = null ;
this . resultSetToObject = null ;
}
2017-05-16 16:56:53 -04:00
@Override
2017-05-17 17:32:48 -04:00
public T mapRowToReturnType ( ) throws SQLException {
return resultSetToObject . toObject ( _resultSet , _cal ) ;
2017-05-16 16:56:53 -04:00
}
2017-05-17 17:32:48 -04:00
@Override
public K getMapKey ( ) throws SQLException {
return resultSetToObject . getFirstColumn ( _resultSet , _cal ) ;
}
2017-05-17 13:49:36 -04:00
2017-05-16 16:56:53 -04:00
@Override
protected String [ ] getKeysFromResultSet ( ) throws SQLException {
if ( keys = = null )
throw new MapperException ( " not supported here " ) ;
return keys ;
}
@Override
protected void getFieldMappings ( ) throws SQLException {
throw new MapperException ( " not supported here " ) ;
}
2017-05-17 17:32:48 -04:00
public interface ResultSetToObject < K , T > {
K getFirstColumn ( final ResultSet rs , final Calendar cal ) throws SQLException ;
2017-05-16 16:56:53 -04:00
T toObject ( final ResultSet rs , final Calendar cal ) throws SQLException ;
}
protected String typeFromName ( final Class < ? > type ) {
2017-05-17 17:32:48 -04:00
if ( type = = null )
return " Object " ;
2017-05-17 15:45:45 -04:00
if ( _columnCount = = 1 & & type . isPrimitive ( ) ) {
// need the object equivalent here, what is the best way? this works, isn't pretty...
if ( type . equals ( Character . TYPE ) )
return " Character " ;
if ( type . equals ( Integer . TYPE ) )
return " Integer " ;
final char [ ] name = type . getName ( ) . toCharArray ( ) ;
name [ 0 ] = Character . toUpperCase ( name [ 0 ] ) ;
return new String ( name ) ;
} else if ( returnMap | | componentType = = null ) {
2017-05-17 11:18:58 -04:00
return type . getName ( ) ;
2017-05-17 15:45:45 -04:00
} else {
2017-05-17 11:18:58 -04:00
// an array, annoying syntax
final String name = type . getName ( ) ;
final char charType = name . charAt ( 1 ) ;
switch ( charType ) {
case 'L' :
return name . substring ( 2 , name . length ( ) - 1 ) + " [] " ;
case 'Z' :
return " boolean[] " ;
case 'B' :
return " byte[] " ;
case 'C' :
return " char[] " ;
case 'D' :
return " double[] " ;
case 'F' :
return " float[] " ;
case 'I' :
return " int[] " ;
case 'J' :
return " long[] " ;
case 'S' :
return " short[] " ;
case '[' :
default :
throw new MapperException ( " only supports single dimensional array " ) ;
}
}
2017-05-16 16:56:53 -04:00
}
2017-06-07 02:43:46 -04:00
public static String escapeMapKeyString ( final String s ) {
2017-05-16 16:56:53 -04:00
// todo: escape key string, newlines, double quotes, backslashes...
2017-05-17 11:18:58 -04:00
// actually it seems like those wouldn't be valid SQL column names, so we won't bother until we hear different...
return '"' + s + '"' ;
2017-05-16 16:56:53 -04:00
}
// code generation down here
2017-05-27 23:54:22 -04:00
protected ResultSetToObject < K , T > genClass ( ) throws IOException {
2017-05-16 16:56:53 -04:00
final String className = " CompilingMapper " ;
final String tType = typeFromName ( _returnTypeClass ) ;
2017-05-17 17:32:48 -04:00
final String kType = typeFromName ( _mapKeyType ) ;
2017-05-16 16:56:53 -04:00
final String header =
" import static com.moparisthebest.jdbc.util.ResultSetUtil.*; \ n \ n " +
" public final class " + className +
2017-05-17 17:32:48 -04:00
" implements com.moparisthebest.jdbc.CompilingRowToObjectMapper.ResultSetToObject< " + kType + " , " + tType + " > { \ n " +
2017-05-16 16:56:53 -04:00
" public " + tType + " toObject(final java.sql.ResultSet rs, final java.util.Calendar cal) throws java.sql.SQLException { \ n " ;
2017-05-17 17:32:48 -04:00
final String footer = " ; \ n } \ n " +
2017-05-16 16:56:53 -04:00
" } \ n " ;
final StringBuilder java = new StringBuilder ( header ) ;
//java.append("return null;\n");
gen ( java , tType ) ;
2017-05-27 23:54:22 -04:00
java . append ( " return ret; \ n " ) ;
2017-05-17 17:32:48 -04:00
java . append ( " } \ n \ n public " ) . append ( kType ) . append ( " getFirstColumn(final java.sql.ResultSet rs, final java.util.Calendar cal) throws java.sql.SQLException { \ n " ) ;
if ( _mapKeyType ! = null ) {
java . append ( " return " ) ;
2017-05-27 23:54:22 -04:00
extractColumnValueString ( java , 1 , _mapKeyType ) ;
2017-05-17 17:32:48 -04:00
} else {
java . append ( " throw new com.moparisthebest.jdbc.MapperException(com.moparisthebest.jdbc.CompilingRowToObjectMapper.firstColumnError) " ) ;
}
2017-05-16 16:56:53 -04:00
java . append ( footer ) ;
2017-05-18 14:26:23 -04:00
//System.out.println(java);
2017-05-16 16:56:53 -04:00
return compiler . compile ( className , java ) ;
}
2017-05-27 23:54:22 -04:00
public void gen ( final Appendable java , final String tType ) throws IOException {
2017-05-16 16:56:53 -04:00
2017-05-17 17:32:48 -04:00
if ( mapOnlySecondColumn ) {
2017-05-27 23:54:22 -04:00
java . append ( " final " ) . append ( tType ) . append ( " ret = " ) ;
2017-05-17 17:32:48 -04:00
extractColumnValueString ( java , 2 , _tmf . getTypeId ( _returnTypeClass ) ) ;
java . append ( " ; \ n " ) ;
return ;
}
2017-05-17 13:07:08 -04:00
lazyLoadConstructor ( ) ;
2017-05-16 16:56:53 -04:00
if ( resultSetConstructor ) {
2017-05-27 23:54:22 -04:00
java . append ( " final " ) . append ( tType ) . append ( " ret = new " ) . append ( tType ) . append ( " (rs); \ n " ) ;
2017-05-16 16:56:53 -04:00
return ;
}
if ( returnMap ) // we want a map
try {
// todo: does not call getMapImplementation, I think that's fine
2017-05-17 11:18:58 -04:00
java . append ( " final " ) . append ( tType ) . append ( " <String, Object> ret = new " ) . append ( tType ) . append ( " <String, Object>(); \ n " ) ;
2017-05-16 16:56:53 -04:00
final int columnLength = _columnCount + 1 ;
if ( componentType ! = null & & componentType ! = Object . class ) { // we want a specific value type
int typeId = _tmf . getTypeId ( componentType ) ;
for ( int x = 1 ; x < columnLength ; + + x ) {
2017-05-26 11:43:33 -04:00
java . append ( " ret.put( " ) . append ( escapeMapKeyString ( keys [ x ] ) . toLowerCase ( ) ) . append ( " , " ) ;
2017-05-16 16:56:53 -04:00
extractColumnValueString ( java , x , typeId ) ;
java . append ( " ); \ n " ) ;
}
} else // we want a generic object type
for ( int x = 1 ; x < columnLength ; + + x )
2017-05-27 23:54:22 -04:00
java . append ( " ret.put( " ) . append ( escapeMapKeyString ( keys [ x ] . toLowerCase ( ) ) ) . append ( " , rs.getObject( " ) . append ( String . valueOf ( x ) ) . append ( " )); \ n " ) ;
2017-05-16 16:56:53 -04:00
return ;
} catch ( Throwable e ) {
throw new MapperException ( e . getClass ( ) . getName ( ) + " when trying to create a Map<String, "
+ ( componentType = = null ? " java.lang.Object " : componentType . getName ( ) ) + " > from a ResultSet row " +
" , all columns must be of the map value type " , e ) ;
}
else if ( componentType ! = null ) // we want an array
try {
2017-05-27 23:54:22 -04:00
java . append ( " final " ) . append ( tType ) . append ( " ret = new " ) . append ( tType . substring ( 0 , tType . length ( ) - 1 ) ) . append ( String . valueOf ( _columnCount ) ) . append ( " ]; \ n " ) ;
2017-05-16 16:56:53 -04:00
final int typeId = _tmf . getTypeId ( componentType ) ;
for ( int x = 0 ; x < _columnCount ; ) {
2017-05-27 23:54:22 -04:00
java . append ( " ret[ " ) . append ( String . valueOf ( x ) ) . append ( " ] = " ) ;
2017-05-16 16:56:53 -04:00
extractColumnValueString ( java , + + x , typeId ) ;
java . append ( " ; \ n " ) ;
}
2017-05-17 11:18:58 -04:00
return ;
2017-05-16 16:56:53 -04:00
} catch ( Throwable e ) {
throw new MapperException ( e . getClass ( ) . getName ( ) + " when trying to create a "
+ componentType . getName ( ) + " [] from a ResultSet row, all columns must be of that type " , e ) ;
}
// if the ResultSet only contains a single column we may be able to map directly
// to the return type -- if so we don't need to build any structures to support
// mapping
if ( _columnCount = = 1 ) {
final int typeId = _tmf . getTypeId ( _returnTypeClass ) ;
try {
if ( typeId ! = TypeMappingsFactory . TYPE_UNKNOWN ) {
2017-05-27 23:54:22 -04:00
java . append ( " final " ) . append ( tType ) . append ( " ret = " ) ;
2017-05-16 16:56:53 -04:00
extractColumnValueString ( java , 1 , typeId ) ;
java . append ( " ; \ n " ) ;
return ;
} else {
// we still might want a single value (i.e. java.util.Date)
/ *
Object val = extractColumnValue ( 1 , typeId ) ;
if ( _returnTypeClass . isAssignableFrom ( val . getClass ( ) ) ) {
return _returnTypeClass . cast ( val ) ;
}
* /
// we could actually pull from first row like above and test it first and fail now, but maybe just failing during compilation is enough?
2017-05-27 23:54:22 -04:00
java . append ( " final " ) . append ( tType ) . append ( " ret = ( " ) . append ( tType ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
extractColumnValueString ( java , 1 , typeId ) ;
java . append ( " ; \ n " ) ;
return ;
}
} catch ( Exception e ) {
throw new MapperException ( e . getMessage ( ) , e ) ;
}
}
if ( _fields = = null ) {
try {
super . getFieldMappings ( ) ;
} catch ( SQLException e ) {
throw new MapperException ( e . getMessage ( ) , e ) ;
}
}
java . append ( " final " ) . append ( tType ) . append ( " ret = new " ) . append ( tType ) . append ( " (); \ n " ) ;
for ( int i = 1 ; i < _fields . length ; i + + ) {
AccessibleObject f = _fields [ i ] ;
//_args[0] = extractColumnValue(i, _fieldTypes[i]);
//System.out.printf("field: '%s' obj: '%s' fieldType: '%s'\n", _fields[i], _args[0], _fieldTypes[i]);
// custom hacked-in support for enums, can do better when we scrap org.apache.beehive.controls.system.jdbc.TypeMappingsFactory
if ( _fieldTypes [ i ] = = 0 ) {
final Class < ? > fieldType = f instanceof Field ? ( ( Field ) f ) . getType ( ) : ( ( Method ) f ) . getParameterTypes ( ) [ 0 ] ;
if ( Enum . class . isAssignableFrom ( fieldType ) ) {
_args [ 0 ] = Enum . valueOf ( ( Class < ? extends Enum > ) fieldType , ( String ) _args [ 0 ] ) ;
if ( f instanceof Field ) {
// if f not accessible (but super.getFieldMappings() sets it), throw exception during compilation is fine
java . append ( " ret. " ) . append ( ( ( Field ) f ) . getName ( ) ) . append ( " = " ) . append ( typeFromName ( fieldType ) ) . append ( " .valueOf( " ) ;
extractColumnValueString ( java , i , _fieldTypes [ i ] ) ;
java . append ( " ); \ n " ) ;
} else {
java . append ( " ret. " ) . append ( ( ( Method ) f ) . getName ( ) ) . append ( " ( " ) . append ( typeFromName ( fieldType ) ) . append ( " .valueOf( " ) ;
extractColumnValueString ( java , i , _fieldTypes [ i ] ) ;
java . append ( " )); \ n " ) ;
}
}
}
if ( f instanceof Field ) {
// if f not accessible (but super.getFieldMappings() sets it), throw exception during compilation is fine
java . append ( " ret. " ) . append ( ( ( Field ) f ) . getName ( ) ) . append ( " = " ) ;
extractColumnValueString ( java , i , _fieldTypes [ i ] ) ;
java . append ( " ; \ n " ) ;
} else {
java . append ( " ret. " ) . append ( ( ( Method ) f ) . getName ( ) ) . append ( " ( " ) ;
extractColumnValueString ( java , i , _fieldTypes [ i ] ) ;
java . append ( " ); \ n " ) ;
}
}
// if this resultObject is Finishable, call finish()
if ( Finishable . class . isAssignableFrom ( _returnTypeClass ) )
java . append ( " ret.finish(rs); \ n " ) ;
2017-05-27 23:54:22 -04:00
}
2017-06-07 02:43:46 -04:00
public static void extractColumnValueString ( final Appendable java , final int index , final Class resultType ) throws IOException {
2017-05-27 23:54:22 -04:00
extractColumnValueString ( java , index , _tmf . getTypeId ( resultType ) ) ;
2017-05-16 16:56:53 -04:00
}
/ * *
* Extract a column value from the ResultSet and return it as resultType .
*
* @param index The column index of the value to extract from the ResultSet .
* @param resultType The return type . Defined in TypeMappingsFactory .
* @return The extracted value
* @throws java . sql . SQLException on error .
* /
2017-06-07 02:43:46 -04:00
public static void extractColumnValueString ( final Appendable java , final int index , final int resultType ) throws IOException {
2017-05-16 16:56:53 -04:00
switch ( resultType ) {
case TypeMappingsFactory . TYPE_INT :
2017-05-27 23:54:22 -04:00
java . append ( " rs.getInt( " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_LONG :
2017-05-27 23:54:22 -04:00
java . append ( " rs.getLong( " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_FLOAT :
2017-05-27 23:54:22 -04:00
java . append ( " rs.getFloat( " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_DOUBLE :
2017-05-27 23:54:22 -04:00
java . append ( " rs.getDouble( " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_BYTE :
2017-05-27 23:54:22 -04:00
java . append ( " rs.getByte( " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_SHORT :
2017-05-27 23:54:22 -04:00
java . append ( " rs.getInt( " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_BOOLEAN :
2017-05-27 23:54:22 -04:00
java . append ( " getBooleanYN(rs, " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_INT_OBJ :
2017-05-27 23:54:22 -04:00
java . append ( " getObjectInt(rs, " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_LONG_OBJ :
2017-05-27 23:54:22 -04:00
java . append ( " getObjectLong(rs, " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_FLOAT_OBJ :
2017-05-27 23:54:22 -04:00
java . append ( " getObjectFloat(rs, " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_DOUBLE_OBJ :
2017-05-27 23:54:22 -04:00
java . append ( " getObjectDouble(rs, " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_BYTE_OBJ :
2017-05-27 23:54:22 -04:00
java . append ( " getObjectByte(rs, " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_SHORT_OBJ :
2017-05-27 23:54:22 -04:00
java . append ( " getObjectShort(rs, " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_BOOLEAN_OBJ :
2017-05-27 23:54:22 -04:00
java . append ( " getObjectBooleanYN(rs, " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_STRING :
case TypeMappingsFactory . TYPE_XMLBEAN_ENUM :
2017-05-27 23:54:22 -04:00
java . append ( " rs.getString( " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_BIG_DECIMAL :
2017-05-27 23:54:22 -04:00
java . append ( " rs.getBigDecimal( " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_BYTES :
2017-05-27 23:54:22 -04:00
java . append ( " rs.getBytes( " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_TIMESTAMP :
2017-05-27 23:54:22 -04:00
java . append ( " getTimestamp(rs, cal, " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_TIME :
2017-05-27 23:54:22 -04:00
java . append ( " getTime(rs, cal, " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_SQLDATE :
2017-05-27 23:54:22 -04:00
java . append ( " getSqlDate(rs, cal, " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_DATE :
2017-05-27 23:54:22 -04:00
java . append ( " getUtilDate(rs, cal, " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_CALENDAR :
2017-05-27 23:54:22 -04:00
java . append ( " getCalendar(rs, cal, " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_REF :
2017-05-27 23:54:22 -04:00
java . append ( " rs.getRef( " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_BLOB :
2017-05-27 23:54:22 -04:00
java . append ( " rs.getBlob( " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_CLOB :
2017-05-27 23:54:22 -04:00
java . append ( " rs.getClob( " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_ARRAY :
2017-05-27 23:54:22 -04:00
java . append ( " rs.getArray( " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
case TypeMappingsFactory . TYPE_READER :
case TypeMappingsFactory . TYPE_STREAM :
throw new MapperException ( " streaming return types are not supported by the JdbcControl; use ResultSet instead " ) ;
case TypeMappingsFactory . TYPE_STRUCT :
case TypeMappingsFactory . TYPE_UNKNOWN :
// JAVA_TYPE (could be any), or REF
2017-05-27 23:54:22 -04:00
java . append ( " rs.getObject( " ) . append ( String . valueOf ( index ) ) . append ( " ) " ) ;
2017-05-16 16:56:53 -04:00
return ;
default :
throw new MapperException ( " internal error: unknown type ID: " + Integer . toString ( resultType ) ) ;
}
}
}