Java 如何使用Mybatis和PostgreSQL创建空数组?
当我用Mybatis和Postgres写我的项目时,发生了一些令人恶心的事情 您知道Postgres有一个很棒的类型数组,但是创建java.sql.ARRAY的唯一方法是java.sql.Connection:createOftypeName,arrayContent,以下是背景 为了在列表和数组之间建立关系,我编写了以下TypeHandler:Java 如何使用Mybatis和PostgreSQL创建空数组?,java,arrays,postgresql,jdbc,mybatis,Java,Arrays,Postgresql,Jdbc,Mybatis,当我用Mybatis和Postgres写我的项目时,发生了一些令人恶心的事情 您知道Postgres有一个很棒的类型数组,但是创建java.sql.ARRAY的唯一方法是java.sql.Connection:createOftypeName,arrayContent,以下是背景 为了在列表和数组之间建立关系,我编写了以下TypeHandler: @MappedTypes(List.class) @MappedJdbcTypes({JdbcType.ARRAY}) public class Li
@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;
}
}
}
if (list.isEmpty()) {
ps.setObject(i, Collections.<Object>emptySet());
} else {
//process non-empty list
}
由于FXCKK擦除,java.sql.Array中没有类型,列表中也没有,而且我的数据库中有很多不同类型的数组,所以我必须制作一个统一的TypeHandler来处理数组和列表的关系
我的解决方案是获取列表中的第一个对象并查看其类型,然后将其映射到数据库中的首选类型。一切似乎都很好
但是当一张空的清单出现时,所有的事情都会一团糟。首先,我无法根据第一个元素确定类型;其次,我无法再次使用列表对象诅咒类型擦除获取类型信息;第三,我无法使用sql.Array对象获取sql类型;第四,我无法创建独立于类型的空sql.Array。在我看来,如果将空数组传递给数据库,那么数据库应该根据它通常的类型来创建它。。。。所以一句话,我被绊倒了
我想知道maybody能帮我吗?我很好,爸爸
请给我 出于我的目的,我将数组映射到Set,它与PreparedStatement.setObject配合得非常好,作为空列表的一个选项,您可以执行以下操作:
@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;
}
}
}
if (list.isEmpty()) {
ps.setObject(i, Collections.<Object>emptySet());
} else {
//process non-empty list
}