Почему мой код JDBC не возвращает записей, когда сам MySQL возвращает запись 1+? - PullRequest
0 голосов
/ 22 сентября 2018

В приложении, которое я писал, один из методов на уровне DAO должен запрашивать базу данных (в данном случае MySQL ), возвращая список записей, соответствующих критериям.Таблица, к которой она относится, - это WordInstance, и она имеет 3 внешних ключа к 3 другим таблицам ( Слова , Части речи и Категории ).Поле Category в таблице wordInstances может иметь значение null , но остальные поля не могут - потому что слово может не иметь категорию.

У меня есть 2 отдельных метода createObjectFromResults и createObjectListFromResults .Внутри createObjectListFromResults есть строка / цикл while (objResults.next ()) и внутри, которая вызывает другую функцию create для выполнения работы для отдельной строки.По какой-то причине он пропускает этот цикл, как будто нет записей для обработки - кроме случаев, когда я беру тот же оператор и подключаю его к рабочей среде MySQL, я получаю 1 строку (преобразование раздела «Category =?» В «Category равно нулю»)"для MySQL Workbench) - это после однократного запуска и без сброса схемы или таблицы между выполнениями.Возможно, я делаю что-то не так с моим sQL-запросом относительно JDBC, чтобы он не возвращал никаких записей?Код ниже:

public List<WordInstance> listByWordPartOfSpeechAndCategory(final Word objWord, final PartOfSpeech objPartOfSpeech, final Category objCategory) throws SQLException
{
    if(!isTableExists())
        createTable();

    try
        {
        PreparedStatement objStatement = getConnection().prepareStatement("select " + getQueriedColumnsForSelect() + " from " + TableName + " where Word = ? and PartOfSpeech = ? and Category = ?;");

        objStatement.setInt(1, objWord.getId());
        objStatement.setInt(2, objPartOfSpeech.getId());

        if(objCategory != null)
            objStatement.setInt(3, objCategory.getId());
        else
            objStatement.setNull(3, Types.INTEGER);

        return(createObjectListFromResults(objStatement.executeQuery()));
        }
    catch(SQLException objException)
        {
        msObjLogger.error("There was a problem retrieving the word instances that had the same word, part of speech, and category...", objException);

        return(null);
        }
    finally
        {
        closeConnection();
        }
}

TableName для этого объекта DAO - "WordInstances", а getQueriedColumnsForSelect:

protected String getQueriedColumnsForSelect()
{
    return("Id, Word, PartOfSpeech, Category, Definition, Slang");
}

createObjectListFromResults находится здесь:

protected List<WordInstance> createObjectListFromResults(final ResultSet objResults) throws SQLException
{
    List<WordInstance> lstWordInstances = new ArrayList<WordInstance>();

    while(objResults.next())
        lstWordInstances.add(createObjectFromResults(objResults));

    return(lstWordInstances);
}

Я могувключите любой другой код по запросу, чтобы помочь разобраться с этой проблемой.Как я уже сказал - в самом MySQL он возвращает строку (или больше, поскольку я заметил проблему, потому что там было несколько записей) - На самом деле несколько записей сбивают меня с толку, потому что у меня есть уникальный ключ для Word, PartOfSpeech и Category, за исключением того факта, чтоКатегория null делает ее уникальной.

Есть мысли?

1 Ответ

0 голосов
/ 22 сентября 2018

Решение, которое я нашел на другом сайте и адаптировал к своему коду, состояло в том, чтобы составить строку SQL, основываясь на том, что если переданная категория была нулевой, тогда используйте ", а Категория равна нулю" иначе "и Категория =?"и при настройке параметров тогда просто установите Category, если она не равна нулю - если она равна нулю, то оператор sQL позаботится о жестко закодированном «is null» - я бы хотел, чтобы JDBC разрешал использовать null вместо a?как параметр, но на самом деле это только вариант с полями установки операторов обновления, а не в предложении where.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...