В моей базе данных есть несколько столбцов jsonb
. Я использую PostgreSQL например
CREATE TABLE trades (
id serial NOT NULL,
accounts jsonb,
//..
//..
);
Мне нужно сопоставить эти jsonb
столбцы с моей моделью данных, используя Spring RowMapper
mapRow()
:
public class DataModelRowMapper implements RowMapper<TestModel> {
@Override
public TestModel mapRow(final ResultSet rs,
final int rowNum) throws SQLException {
List<Account> accounts = jsonParser.parse(rs.getString("accounts"), new TypeReference<List<Account>>() {
});
//other jsonb columns
Account account = accounts.stream()
.filter(account -> account.getType() == Type.CLIENT)
.findFirst()
.orElse(new Account());
final TestModel testModel = new TestModel();
testModel.setId(rs.getString("id"));
testModel.setAccountName(account.getName());
return testModel;
}
}
Внутри mapRow()
Я анализирую json в Java List
, а затем перебираю поток, чтобы найти соответствующее значение, так как возвращаются несколько accounts
. У меня есть несколько дополнительных столбцов jsonb, для которых я выполняю аналогичные операции внутри mapRow()
.
Раньше я возвращал точные значения из самого запроса SQL, который оказался медленным, а затем переместил логи фильтрации c внутрь mapRow()
в java коде, поскольку намерение состоит в том, чтобы повысить производительность и вернуть результат.
У меня вопрос, должен ли я анализировать и фильтровать логи c внутри mapRow? Есть ли более быстрый способ загрузки jsonb
данных и сопоставления со TestModel
accountName
строковым свойством?
Моя проблема в том, что запрос sql выполняется быстро <1 мс на БД, но слой java добавляет некоторые издержки. </p>