Я использую Java 8 и Jdbi версия 2.78 для запроса базы данных.
У меня есть таблица конфигураций ключ-значение для торговцев.
У меня есть класс, который запрашивает базу данных:
import com.clevergift.gson.MerchantConfigsBeanMapper;
import org.skife.jdbi.v2.sqlobject.Bind;
import org.skife.jdbi.v2.sqlobject.SqlQuery;
import org.skife.jdbi.v2.sqlobject.customizers.Mapper;
import java.util.Map;
public abstract class MerchantConfigDAO {
@Mapper(MerchantConfigsBeanMapper.class)
@SqlQuery("SELECT configKey, configValue FROM merchant_configs where merchant = :merchant")
public abstract Map<String, String> getMerchantConfigs(@Bind("merchant") String merchant);
}
И класс MerchantConfigsBeanMapper
должен перебирать результаты:
import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.tweak.ResultSetMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
public class MerchantConfigsBeanMapper implements ResultSetMapper<Map<String, String>> {
@Override
public Map<String, String> map(int index, ResultSet r, StatementContext ctx) throws SQLException {
Map<String, String> configs = new HashMap<String, String>();
int rowcount = 0;
if (r.last()) {
rowcount = r.getRow();
r.beforeFirst(); // not rs.first() because the rs.next() below will move on, missing the first element
}
while (r.next()) {
configs.put(r.getString("configKey"), r.getString("configValue"));
}
return configs;
}
}
Когда я запускаю эту передачу в "adidas", очевидно, должны быть возвращены 3 результата.Однако r
всегда содержит только 1 результат, а r.getString("configValue")
равен cbadmin
.r.last()
всегда верно, поскольку возвращается только 1 результат.
Как это возможно?Почему r
не содержит всех результатов?
РЕДАКТИРОВАТЬ
Я позвонил в MerchantConfigDAO из службы:
import com.clevergift.services.MerchantConfigService;
import com.google.inject.Inject;
import java.util.Map;
public class MerchantConfigServiceImpl implements MerchantConfigService {
private MerchantConfigDAO merchantConfigDAO;
@Inject
public MerchantConfigServiceImpl(MerchantConfigDAO merchantConfigDAO) {
this.merchantConfigDAO = merchantConfigDAO;
}
public Map<String, String> getMerchantConfigs(String merchant) {
Map<String, String> merchantConfigs = this.merchantConfigDAO.getMerchantConfigs(merchant);
return merchantConfigs;
}
}
Даже послеРеализация ответа @ivans здесь , merchantConfigs
все еще имеет длину 1 ...