#java #geotools
Вопрос:
В нашем приложении (Java, Geotools 25, PostGIS) у нас есть формы, в которые пользователь может ввести некоторые данные, которые будут использоваться для создания новых функций. В базе данных (PostGIS) столбцов больше, чем полей, поэтому некоторые столбцы будут пустыми. Для некоторых из этих «пустых» столбцов в базе данных определены значения по умолчанию. Однако Geotools, похоже, всегда вставляет null для этих столбцов.
В коде у меня есть a SimpleFeatureStore
, и я создаю SimpleFeature
его на основе пользовательского ввода. Когда я вставляю новые функции ( store.addFeatures()
), окончательный SQL, созданный Geotools, представляет собой INSERT INTO
инструкцию, содержащую null
значения для всех столбцов, которые не находятся «в форме», но, опять же, некоторые из них имеют значения по умолчанию в БД. Поскольку Geotools явно устанавливает значение по null
умолчанию, оно никогда не используется.
Есть ли исправление или обходной путь, который я могу попытаться решить эту проблему, чтобы я мог просто позволить БД вставлять значения по умолчанию, когда значение не указано?
Ответ №1:
DataUtilities
Класс предоставляет defaultValues(SimpleFeatureType )
метод, который вы можете вызвать, чтобы получить значение, определенное в PropertyDescriptor
(хотя по умолчанию это значение равно null). Вы можете определить значение по умолчанию для любого или всех ваших атрибутов в вашем SimpleFeatureType
.
Я бы использовал такой код, как:
SimpleFeatureTypeBuilder sftb = new SimpleFeatureTypeBuilder();
sftb.setName("test");
sftb.add("id", Integer.class);
sftb.defaultValue("String");
sftb.add("desc", String.class);
SimpleFeatureType schema = sftb.buildFeatureType();
SimpleFeatureBuilder sfb = new SimpleFeatureBuilder(schema);
sfb.addAll(DataUtilities.defaultValues(schema));
sfb.set("id", 23);
SimpleFeature f = sfb.buildFeature("test.1");
System.out.println(f);
Который создает такую функцию, как:
SimpleFeatureImpl:test=[SimpleFeatureImpl.Attribute: id<id id=test.1>=23,
SimpleFeatureImpl.Attribute: desc<desc id=test.1>=String]
Комментарии:
1. Спасибо вам за ваш ответ. К сожалению, я не думаю, что это сработает в моем случае, так как значения по умолчанию определены в самой базе данных в различных столбцах, а не в коде. Глядя на код хранилища JDBCDataStore, я не вижу способа предотвратить
null
вставки пустых столбцов, поскольку хранилище данных считывает определение для SimpleFeatureType из БД. Поэтому я не могу изменить вставляемые столбцы или используемые значения по умолчанию2. ну, вы можете прочитать значения по умолчанию из таблицы базы данных при построении схемы
3. В конце концов мы пошли на обходной путь в базе данных, используя триггеры. Будем отмечать этот ответ как принятый, так как он помог нам найти наше решение.