3

JDBI で自動生成された主キー (Long 値) を別のクラスに変換してほしい。

私の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
  }
}

コードを実行すると、 FigureItOutResultSetMapper.map(..) で NullPointerException が発生しました。

f = factory.mapperFor(rt, ctx);

f を null に設定します。したがって、私のマッパーが正しく登録されていないと思います。

@RegisterMapper および @Mapper(SystemIdMapper.class) アノテーションを使用することを除いて、私も試しました:

dbi.registerMapper(new SystemIdMapper());

しかし、まだ運がありません。

4

1 に答える 1

3

GetGeneratedKeys アノテーションでマッパーを指定する必要があります。

@GetGeneratedKeys(SystemIdMapper.class)

@Mapper または @RegisterMapper は、ID を取得するために使用されません。テーブルから値を選択するときにのみ使用されます。

于 2015-09-09T11:59:43.330 に答える