[#3443] Add support for conversion of values / arrays to the JDBC Array type in Convert

This commit is contained in:
Lukas Eder 2014-07-23 13:30:37 +02:00
parent a4629b6f5b
commit d6d24bb829
2 changed files with 66 additions and 5 deletions

View File

@ -74,6 +74,7 @@ import org.jooq.Field;
import org.jooq.Record;
import org.jooq.SQLDialect;
import org.jooq.exception.DataTypeException;
import org.jooq.tools.jdbc.MockArray;
import org.jooq.types.UByte;
import org.jooq.types.UInteger;
import org.jooq.types.ULong;
@ -415,7 +416,7 @@ public final class Convert {
this.toClass = toClass;
}
@SuppressWarnings("unchecked")
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public U from(Object from) {
if (from == null) {
@ -459,7 +460,14 @@ public final class Convert {
return convert(Arrays.toString((byte[]) from), toClass);
}
else if (fromClass.isArray()) {
return (U) convertArray((Object[]) from, toClass);
// [#3443] Conversion from Object[] to JDBC Array
if (toClass == java.sql.Array.class) {
return (U) new MockArray(null, (Object[]) from, fromClass);
}
else {
return (U) convertArray((Object[]) from, toClass);
}
}
// All types can be converted into String
@ -727,9 +735,7 @@ public final class Convert {
// literals to Enum values without a Converter
else if ((fromClass == String.class) && java.lang.Enum.class.isAssignableFrom(toClass)) {
try {
@SuppressWarnings("rawtypes")
Class raw = toClass;
return (U) java.lang.Enum.valueOf(raw, (String) from);
return (U) java.lang.Enum.valueOf((Class) toClass, (String) from);
}
catch (IllegalArgumentException e) {
return null;
@ -781,6 +787,11 @@ public final class Convert {
xxxxx xxx xxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxx xxxx x x xxxxxxxxx x x xx x x xxxxxxxx xxx
x
x
xx xxxxxxx xxxxxxxxxx xx xxxxxxxxxxx xx xxxx xxxxx
xxxx xx xxxxxxxx xx xxxxxxxxxxxxxxxxxxxxx x
xxxxxx xxx xxx xxxxxxxxxxxxxxx xxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
x
xxxx x
xxxxxx xxx xxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxx
x

View File

@ -41,6 +41,7 @@
package org.jooq.test;
import static org.jooq.tools.reflect.Reflect.wrapper;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@ -48,9 +49,12 @@ import java.lang.reflect.Array;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Date;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import org.jooq.Record;
import org.jooq.Result;
import org.jooq.tools.Convert;
import org.junit.Test;
@ -304,4 +308,50 @@ public class ConvertAllTest extends AbstractTest {
assertTrue(toArrayClass.isInstance(conv4));
assertTrue(toArrayClass.isInstance(conv5));
}
@Test
public void testToJDBCArray() throws SQLException {
Object[] from1 = null;
java.sql.Array a1 = Convert.convert(from1, java.sql.Array.class);
assertNull(a1);
Object[] from2 = new Object[0];
java.sql.Array a2 = Convert.convert(from2, java.sql.Array.class);
Result<Record> r2 = create.fetch(a2.getResultSet());
assertArrayEquals(from2, (Object[]) a2.getArray());
assertEquals(0, r2.size());
assertEquals(2, r2.fields().length);
assertEquals("INDEX", r2.field(0).getName());
assertEquals(Long.class, r2.field(0).getType());
assertEquals("VALUE", r2.field(1).getName());
assertEquals(Object.class, r2.field(1).getType());
Object[] from3 = { 1 };
java.sql.Array a3 = Convert.convert(from3, java.sql.Array.class);
Result<Record> r3 = create.fetch(a3.getResultSet());
assertArrayEquals(from3, (Object[]) a3.getArray());
assertEquals(1, r3.size());
assertEquals(1L, r3.getValue(0, "INDEX"));
assertEquals(1, r3.getValue(0, "VALUE"));
assertEquals(2, r3.fields().length);
assertEquals("INDEX", r3.field(0).getName());
assertEquals(Long.class, r3.field(0).getType());
assertEquals("VALUE", r3.field(1).getName());
assertEquals(Object.class, r3.field(1).getType());
String[] from4 = { "A", "B" };
java.sql.Array a4 = Convert.convert(from4, java.sql.Array.class);
Result<Record> r4 = create.fetch(a4.getResultSet());
assertArrayEquals(from4, (String[]) a4.getArray());
assertEquals(2, r4.size());
assertEquals(1L, r4.getValue(0, "INDEX"));
assertEquals("A", r4.getValue(0, "VALUE"));
assertEquals(2L, r4.getValue(1, "INDEX"));
assertEquals("B", r4.getValue(1, "VALUE"));
assertEquals(2, r4.fields().length);
assertEquals("INDEX", r4.field(0).getName());
assertEquals(Long.class, r4.field(0).getType());
assertEquals("VALUE", r4.field(1).getName());
assertEquals(String.class, r4.field(1).getType());
}
}