когда я писал свой проект с использованием Mybatis и Postgres, произошло нечто отвратительное.
Вы знаете, что у Postgres есть замечательный тип ARRAY
, но единственный способ создать java.sql.Array
- это java.sql.Connection:createOf(typeName, arrayContent)
, вот фон.
Чтобы построить отношения между List и ARRAY, я написал TypeHandler
следующее:
@MappedTypes(List.class)
@MappedJdbcTypes({JdbcType.ARRAY})
public class ListTypeHandler extends BaseTypeHandler<List> {
private static final String TYPE_NAME_UUID = "uuid";
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List list, JdbcType jdbcType) throws SQLException {
Connection conn = ps.getConnection();
if(list.size() != 0) {
Object[] parameter = list.toArray(new Object[0]);
String typeName = null;
// using a switch to determine how to map the Java type to the sql type
if (list.get(0) instanceof UUID) {
typeName = TYPE_NAME_UUID;
}
if (typeName == null) {
throw new TypeException("ArrayTypeHandler parameter typeName error, your type is " + parameter.getClass().getName());
}
Array array = conn.createArrayOf(typeName, parameter);
ps.setArray(i, array);
} else {
// here is the hard point
ps.setArray(i, conn.createArrayOf("uuid", new Object[0]));
}
}
private List getArray(Array array) {
try {
return Arrays.asList((Object[])array.getArray());
} catch (Exception e) {
return null;
}
}
}
Поскольку в java.sql.Array
нет ни типа, ни в List (из-за стирания fxcking), и в моей базе данных есть множество массивов с разными типами, поэтому я должен создать единый TypeHandler
для работы с Array
и List
отношения.
Мое решение состоит в том, чтобы взять первый объект списка и посмотреть, что это за тип, а затем сопоставить его с типом, поддерживаемым базой данных. Кажется, все хорошо.
Но когда входит пустой список, все запутывается. Во-первых, я не могу определить тип на основе первого элемента; во-вторых, я не могу получить информацию о типе с объектом List (снова проклятие типа стирание); в-третьих, я не могу получить тип sql с sql.Array
Object; в-четвертых, я не могу создать пустой sql.Array
независимо от типа (по моему мнению, если передать пустой массив в базу данных, база данных должна создать его в зависимости от того, каким типом он является ...). Одним словом, я застрял ...
Интересно, кто-нибудь может мне помочь? я SOOOOOOOO DADDDDDDDD .....
ПОЖАЛУЙСТА, Orz ....................