Как создать пустой массив с помощью Mybatis и PostgreSQL? - PullRequest
0 голосов
/ 06 мая 2018

когда я писал свой проект с использованием 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 ....................

1 Ответ

0 голосов
/ 07 мая 2018

Для моих целей я сопоставляю массивы с Set, и он отлично работает с PreparedStatement.setObject, и вы можете в качестве опции для пустого списка сделать следующее:

if (list.isEmpty()) {
   ps.setObject(i, Collections.<Object>emptySet());
} else {
   //process non-empty list
}
...