Не удается получить все строки при использовании ResultSetMapper для анализа результатов - PullRequest
0 голосов
/ 04 октября 2018

Я использую Java 8 и Jdbi версия 2.78 для запроса базы данных.

У меня есть таблица конфигураций ключ-значение для торговцев.

enter image description here

У меня есть класс, который запрашивает базу данных:

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 ...

1 Ответ

0 голосов
/ 04 октября 2018

Mapper должен отображать одну строку за раз со следующим кодом.Из документации:

Сопоставители строк вызываются один раз для каждой строки в наборе результатов.

@Override
public Map<String, String> map(int index, ResultSet r, StatementContext ctx) throws SQLException {
    Map<String, String> configs = new HashMap<String, String>();
    configs.put(r.getString("configKey"), r.getString("configValue"));
    return configs;
}

Если вы все еще хотите обработать целые ResultSet за один вызовВы должны вернуть List<Map<String, String>>.Один map для каждой строки в ResultSet.

Согласно документации

Методы запроса могут возвращать одно- или многострочный результат, в зависимости от того, тип возвращаемого метода выглядит как коллекция .

Измените метод DAO, чтобы он возвращал List<Map<String, String>>

...