Как совместить JDBI @GetGeneratedKeys с Mapper

Я хотел бы, чтобы JDBI преобразовал автоматически сгенерированный первичный ключ (Long value) в другой класс.

Мой DAO:

@RegisterMapper(SystemIdMapper.class)
public interface SystemDao {
  @SqlUpdate("insert into systems(device_id, user_id) values(:deviceId.value, :userId.value)")
  @GetGeneratedKeys
  @Mapper(SystemIdMapper.class)
  SystemId insert(@BindBean("deviceId") DeviceId deviceId, @BindBean("userId") UserId userId);

}

Мой картограф

public class SystemIdMapper implements ResultSetMapper<SystemId> {
  @Override
  public SystemId map(int index, ResultSet r, StatementContext ctx) {
    return new SystemId(0L); //fake mapping to simplify example
  }
}

Когда я запускаю свой код, я получаю NullPointerException в FigureItOutResultSetMapper.map(..), потому что

f = factory.mapperFor(rt, ctx);

установите f в ноль. Так что я думаю, что мой картограф неправильно зарегистрирован.

Кроме использования аннотаций @RegisterMapper и @Mapper(SystemIdMapper.class) я также пробовал:

dbi.registerMapper(new SystemIdMapper());

но все же без удачи.

1 ответ

Решение

Вам нужно указать маппер в аннотации GetGeneratedKeys.

@GetGeneratedKeys(SystemIdMapper.class)

@Mapper или @RegisterMapper не используются для получения идентификатора обратно. Используется только при выборе значений из таблицы.

Другие вопросы по тегам