【问题标题】:Retrieving selected fields from database using Hibernate使用 Hibernate 从数据库中检索选定的字段
【发布时间】: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();
}

在这里,我正在获取两个字段 categoryIdcategoryImage,这些字段在给定的 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&lt;Object[]&gt;

我只想删除存储在目录中的文件,然后从数据库中检索到它们的名称,并且在 HQL 的字段列表中提及 catId 是完全没有必要的。

为什么在这种情况下需要在HQL语句的字段列表中添加catId

【问题讨论】:

  • 很简单。方法getOldFileName(String []ids) 尝试返回List&lt;String&gt; 而不是返回List&lt;Object[]&gt;,因为在此查询中只有一个String 类型的字段catImage - select catImage from Category where catId in(:id)。想了半天,还是想不通这个简单的事情,才问出这个问题。很抱歉给您带来不便。

标签: spring hibernate hql


【解决方案1】:

列表的返回类型应该是 List。当只有一列返回时,休眠不会将结果放入 Object[]

【讨论】:

  • 谢谢。我突然意识到我一直在监督的问题,在我发布问题之前无法弄清楚,因为我在问题部分下方发表了评论。
猜你喜欢
  • 1970-01-01
  • 2016-05-17
  • 2012-01-25
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多