【问题标题】:java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.bdisys.promorphics.domain.Blogjava.lang.ClassCastException:[Ljava.lang.Object;无法转换为 com.bdisys.promorphics.domain.Blog
【发布时间】:2014-02-19 13:39:01
【问题描述】:

这是一个非常重要的问题,我被打动了......如果有人能回答它,那将是非常明显的!

错误信息:

Feb 19, 2014 6:56:08 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.bdisys.promorphics.domain.Blog
    at org.apache.jsp.Mydetails_jsp._jspService(Mydetails_jsp.java:951)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
    at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
    at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:381)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
    at java.lang.Thread.run(Unknown Source)

 Details of blogs are===[[Ljava.lang.Object;@18fc85, [Ljava.lang.Object;@6a86fe, [Ljava.lang.Object;@1c49309, [Ljava.lang.Object;@9160e3, [Ljava.lang.Object;@6fecea, [Ljava.lang.Object;@2b0e77, [Ljava.lang.Object;@c2c269, [Ljava.lang.Object;@699ec3, [Ljava.lang.Object;@363c6c, [Ljava.lang.Object;@b9141c, [Ljava.lang.Object;@d75341, [Ljava.lang.Object;@9af4bc, [Ljava.lang.Object;@1399537, [Ljava.lang.Object;@173640c, [Ljava.lang.Object;@ad799a, [Ljava.lang.Object;@10aa63a, [Ljava.lang.Object;@274a2b, [Ljava.lang.Object;@1767836, [Ljava.lang.Object;@ce5230, [Ljava.lang.Object;@175fbe3]

DaoImpl 方法:

这是我的 Dao 方法,我正在执行 sql 查询并将对象列表返回到我的 jsp 页面以进行打印。

public List<Blog> getTopBlogsQuesByDate()throws Exception {
        List<Blog> blogs = new ArrayList<Blog>(0);
        try{
             String sql = "select title , date from (select blog_title as title ,created_date as date from  blog  union select ask_question as title , created_on as date from askquestions ) as aa order by date desc";
             SQLQuery query = getSession().createSQLQuery(sql);
             return query.list();
        }

        catch(Exception e){
            e.printStackTrace();
        }finally{
            closeSession();
        }

        return blogs;
    }

jsp:

这里我正在使用 sql 查询获取两个表的数据,但是我应该如何在我的 jsp 中打印值列表???它!!提前谢谢.....

<tr>
                    <td style="border: 2px dotted #FFFFFF; border-radius:5px; background-color:#f3ecf0;">
              <% 
                          List<Blog> blog2 =new ArrayList<Blog>();
                          BlogDaoImpl blogDaoImpl1=new BlogDaoImpl();
                          blog2=blogDaoImpl1.getTopBlogsQuesByDate();
                          System.out.println(" Details of blogs are==="+blog2);




                    %>


                         <ul style="text-align: left; left:0px;font-size: 13px; margin-left:-20px; overflow-y: scroll; height:465px;  list-style:url('images/arrows.png');  font-family:Palatino Linotype; color:#2a2a2a; border: 0px solid #d4d4d4" >
                              <% 
           for(int i=0;i<blog2.size();i++){

               Blog blogs1=new Blog();
               blogs1=blog2.get(i);
               System.out.println("blogs size is===="+blog2.size()); 

                blogs1.getId();
                String paths="showblog/"+ blogs1.getBlogTitle()+"/"+blogs1.getId();
         %>
                             <li style="border-bottom : 2px dotted #FFFFFF; margin-bottom: 10px;"><%=blogs1.getBlogText() %></li> 
                   <%} %>
                         </ul>
                    </td>
                </tr>

【问题讨论】:

  • 您的return 方法中有两个return 语句,其中一个(第一个)可能不应该存在。您可能希望遍历您的结果,创建 Blog 的实例并将它们添加到 blogs 方法变量,然后最终在方法结束时返回它。
  • 我从两个表 'blogs' 和 'askquestions' 中获取数据并将其返回给 jsp 并获取控制台中显示的所有对象..但我无法在 jsp 中打印它们。那就是发生异常.....

标签: java sql hibernate jsp hql


【解决方案1】:

Hibernate 处理字段子集返回的方式是将它们存储在Object[] 中。这是处理 N 数量不同类型字段的最佳通用上层类(最坏的情况:它们都是不同的)。由于您的方法返回List&lt;Blog&gt;,因此第一个返回语句return query.list() 将返回List&lt;Object[]&gt;,因此异常。

您应该直接选择Blog 实体(如果存在此类实体)或遍历每个结果并将每个Object[] 中收集的数据存储到Blog 实例中,并将其添加到返回列表中。

编辑 2

我很好奇你是如何在没有列表迭代、实例创建和基本列表处理的基本知识的情况下完成这样一项任务的......我正在添加伪代码以进一步帮助你。

databaseList = query.list()
iterator = obtain iterator from databaseList 
while the iterator has elements
    obtain element
    create new Blog
    set blog data
    add blog to "blogs" list

然后,该列表将由方法末尾的return blogs; 行返回。请注意,Hibernate 返回一个 Object[] 列表(Object 类型的数组),其中每个 Object[] 代表一个返回的记录。这些数组按选择的顺序包含所选列的值。在您的情况下,它们将具有两个元素,即按特定顺序排列的博客标题和日期。

【讨论】:

  • 您现在应该已经熟悉了一切,如果没有,我建议您阅读规范或至少阅读您使用的方法的 Javadoc。对于这种情况,它相当简单并且与语言无关。我会用一种教育方法让你明白你应该做什么,而不是用勺子喂你代码,因为如果下次没有人出现,你可能会再呆一周。
  • 我添加了伪代码和 Hibernate 用于返回数据的结构的简要说明。
  • @SalmanAmaan 不要修改答案以提出更多问题或详细说明您的问题/要求。谢谢。
  • @SalmanAmaan 来自博客的数据存储在列表中包含的每个 Object[] 上。当您使用本机查询时,映射不是问题。您的问题集中在您遇到的异常以及如何避免它上,而迭代不是我回答的中心,这是关于如何解决异常问题而不是“对代码进行必要的更改”的特别提示“如你所问。数据就在那里,如果您需要进一步的数据更新您的选择查询。新字段将作为附加元素添加到数组中。
  • @SalmanAmaan 另外,我可以说问题在于您没有得到答案的关键概念:迭代,是的,但是将每个 Object[] 变成 Blog 以便您的方法返回正确的类型。
猜你喜欢
  • 2014-07-08
  • 2012-08-07
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 2015-10-18
  • 2014-05-09
  • 2015-02-01
  • 1970-01-01
相关资源
最近更新 更多