当MySQL本身返回1+条记录时,为什么我的JDBC代码不返回任何记录?

时间:2018-09-22 13:20:26

标签: java mysql jdbc

在我编写的应用程序中,DAO层中的一种方法应该查询数据库(在本例中为 MySQL ),并返回符合条件的记录列表。它引用的表是WordInstance,它具有3个外键,可以指向其他3个表(单词词类类别)。 wordInstances 表中的 Category 类别可以为 null ,但其余字段则不能为-因为单词可能没有类别。< / p>

我有2个单独的方法 createObjectFromResults createObjectListFromResults 。在createObjectListFromResults内部,有一个行/循环while(objResults.next())及其内部,它调用另一个create函数为单个行完成工作。无论出于何种原因,它都将跳过该循环,就好像没有记录要处理一样-除非当我使用相同的语句并将其插入MySQL的工作台时,我会得到1行(将“ Category =?”部分转换为“ Category为null “(对于MySQL Workbench))-这是在运行了一次并且没有在两次执行之间删除架构或表之后。我是否可能对JDBC做不正确的w / sQL查询,以使其不返回记录?代码如下:

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();
        }
}

此DAO对象的TableName是“ 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有唯一的键,除非事实是类别为nu​​ll使其无法唯一。

有什么想法吗?

1 个答案:

答案 0 :(得分:-1)

我在另一个网站上找到并适合我的代码的解决方案是根据传入的Category是否为null,然后使用“ and Category is null”,否则使用“ and Category =?”来组成SQL字符串。然后设置参数时,只需设置Category(如果它不为null)-如果它为null,则sQL语句将使用硬编码“ is null”进行处理-我希望JDBC允许使用null代替?像参数一样,但这实际上只是带有update语句设置字段的选项,而不是where子句中的选项。