数据库驱动在selectOne的时候使用limit2的探讨

50 阅读1分钟

最近在用spring webflux使用响应式数据库驱动r2dbc的时候发现findById的sql是limit 2。看了一下代码如下

public <T> Mono<T> selectOne(Query query, Class<T> entityClass) throws DataAccessException {
    return doSelect(query.isLimited() ? query : query.limit(2), entityClass, getTableName(entityClass), entityClass,
          RowsFetchSpec::one);
}

后面查到是用于唯一值检测:

org.springframework.dao.IncorrectResultSizeDataAccessException: Query [SELECT t_product_factory_1.* FROM t_product_factory_1 WHERE t_product_factory_1.id = ? LIMIT 2] returned non unique result.

RowsFetchSpec::one限制了只有一个返回多个返回就会报错:

@Override
public Mono<T> one() {
    return all().singleOrEmpty()
       .onErrorMap(IndexOutOfBoundsException.class, ex -> {
          String message = String.format("Query [%s] returned non unique result.", this.resultFunction.getSql());
          return new IncorrectResultSizeDataAccessException(message, 1);
       });
}