【发布时间】:2013-01-17 21:25:12
【问题描述】:
我正在使用 Hibernate 从 Oracle 数据库中检索包含选定字段的行列表。在我的应用程序的一个 DAO 中通过以下方法进行检索。
@SuppressWarnings("unchecked")
public List<Object[]> getOldFileName(String []ids)
{
int len=ids.length;
Long longType[]=new Long[len];
for(int i=0;i<len;i++)
{
longType[i]=Long.valueOf(ids[i]);
}
return sessionFactory.getCurrentSession().createQuery("select catId, catImage from Category where catId in(:id)").setParameterList("id", longType).list();
}
在这里,我正在获取两个字段 categoryId 和 categoryImage,这些字段在给定的 HQL 查询中列出,基于 catId 作为 String[] 的数组提供,作为通过 Spring 的方法参数。它运行良好,毫无疑问。
但就我的要求而言,完全没有必要再次检索catId,我想从查询的字段列表中删除catId,如下所示。
select catImage from Category where catId in(:id)
如果我尝试执行此查询,则以下调用 Spring 控制器类中的上述方法,
String temp[]=request.getParameter("setDel").split(",");
List<Object[]> oldFileNames = categoryService.getOldFileName(temp);
//Invokes the preceding method in DAO.
导致以下异常被抛出,
java.lang.ClassCastException: java.lang.String 无法转换为 [Ljava.lang.Object;
异常消息表明 java.lang.String 无法转换为对象数组 - Object[]。 HQL 语句似乎只尝试获取字符串类型的单个值,而不是检索 List<Object[]>。
我只想删除存储在目录中的文件,然后从数据库中检索到它们的名称,并且在 HQL 的字段列表中提及 catId 是完全没有必要的。
为什么在这种情况下需要在HQL语句的字段列表中添加catId?
【问题讨论】:
-
很简单。方法
getOldFileName(String []ids)尝试返回List<String>而不是返回List<Object[]>,因为在此查询中只有一个String类型的字段catImage-select catImage from Category where catId in(:id)。想了半天,还是想不通这个简单的事情,才问出这个问题。很抱歉给您带来不便。