У нас на проекте используется два noSQL решения: монга и кассандра.
Перед выкатом новой версии изменились модели и для поддержания обратной совместимости добавили Boolean филд.
Соответственно, я в кассандре добавляю этот филд: ALTER TABLE x ADD y boolean;
Но теперь этого филда по сути не существует, они все Null, а мне надо , чтобы было False, чтобы интерпретация null не расползалась по коду.
Получается мне надо сделать bulk update по всей таблице, но у меня так и не получилось. Например, я пробовал создать вторичный индекс, по полю, которое сейчас всегда = 0, и : UPDATE x SET y = false WHERE zero_field = 0; не работает.
Совсем недавно интересовал тот же вопрос, но решения на уровне базы увы не нашли. Пришлось городить в entity поле Boolean и обрабатывать это в java-коде.
Спасибо, это действительно решение, и я думал об этом варианте. Но это плохое решение конкретно В НАШЕМ случае. Наш фреймворк используется у клиентов, где в таблице может быть очень много записей. Я не уверен, что кассандровский джава драйвер настолько хорош, что на компе где этот апгрейд скрипт запустится не закончится оперативка например (у некоторых наших клиентов и без этого кассандра иногда выжирала по 80 Гб ОЗУ).
А Вы пробовали сами так делать? можете предоставить рабочий пример? Конкретно мне, например, нужно было добавить boolean колонку и в java бине сделать boolean поле (именно примитив, не обертку), при этом в базе лежит N количество записей и я знать не знаю какие конкретно там primary key. Ваш подход подразумевает написание какой-нибудь левой тулы, которую надо запустить на готовой базе, что в общем-то в общем случае неприемлимо, это равнозначно руками обновить в базе в каждую старую запись.
Павел Дуденков: есть несколько моментов : 1) вычитка данных должна быть только с пейджингом 2) читаем только primary keys 3) по возможности используем апи для выборки только primary keys вместо апи для обычных select
sirs: мы пользовались обеими подходами, метод для маппинга данных внутри дао выглядит как-то так:
protected ResultEntity map (Object row) { // row - api specific object
Integer id = row.getField (Integer.class, "id", null); // type, column name, default value
Boolean nullableField = row.getField(Boolean.class. "nullableField", Boolean.FALSE);
ResultEntity e = new ResultEntity();
e.setId (id);
e.setNullableField (nullableField.booleanValue());
return e;
}
А мы кстати эту проблему решили в рамках сеттера для Boolean поля, аргумент сеттера тоже Boolean , если null - то пишем в поле false, а потом когда эта энтити запишется назад в кассандру - получится как раз update on demand :)