在我编写的应用程序中,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有唯一的键,除非事实是类别为null使其无法唯一。
有什么想法吗?
答案 0 :(得分:-1)
我在另一个网站上找到并适合我的代码的解决方案是根据传入的Category是否为null,然后使用“ and Category is null”,否则使用“ and Category =?”来组成SQL字符串。然后设置参数时,只需设置Category(如果它不为null)-如果它为null,则sQL语句将使用硬编码“ is null”进行处理-我希望JDBC允许使用null代替?像参数一样,但这实际上只是带有update语句设置字段的选项,而不是where子句中的选项。