当我用Mybatis和Postgres写我的项目时,发生了一些恶心的事情。
你知道Postgres有一种很棒的类型
ARRAY
,但创建
java.sql.Array
是
java.sql.Connection:createOf(typeName, arrayContent)
,以下是背景。
为了在列表和数组之间建立关系,我编写了
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;
}
}
}
因为没有输入
JAVAsql。大堆
两者都不在列表中(因为fxcking擦除),而且我的数据库中有许多不同类型的数组,所以我必须制定一个统一的
TypeHandler类型处理程序
处理
Array
和
List
关系
我的解决方案是获取列表中的第一个对象并查看其类型,然后将其映射到数据库喜欢的类型。一切似乎都很好。
但是当一张空的清单出现时,所有的事情都会一团糟。首先,我无法根据第一个元素确定类型;其次,我无法使用列表对象获取类型信息(再次诅咒类型擦除);第三,我无法使用
sql.Array
对象第四,我不能创建一个空
sql。大堆
与类型无关(在我看来,如果将空数组传递给数据库,则数据库应根据其类型创建它…)。所以一句话,我被绊倒了。。。
我想知道maybody能帮我吗?我是Sooooooo Dadddddddddd。。。。。
请或。。。。。。。。。。。。。。。。。。。。