繁体   English   中英

[Ljava.lang.Object; 无法从请求 SQL 强制转换为 List

[英][Ljava.lang.Object; cannot be cast to List from a request SQL

我在 jsp 中查看带有 ForEach 的 List 有问题:

我对时间线servlet有这个错误:

Etat HTTP 500 - [Ljava.lang.Object; cannot be cast to fr.gabbler.models.Gabs


type Rapport d''exception

message [Ljava.lang.Object; cannot be cast to fr.gabbler.models.Gabs

description Le serveur a rencontré une erreur interne qui l''a empêché de satisfaire la requête.

exception 
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to fr.gabbler.models.Gabs
    fr.gabbler.servlet.TimelineServlet.doGet(TimelineServlet.java:32)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)

时间线servlet.java

package fr.gabbler.servlet;

import java.io.IOException;
import java.util.List;

import javassist.expr.NewArray;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.jasper.tagplugins.jstl.core.ForEach;

import fr.gabbler.dao.GabDao;
import fr.gabbler.models.Gabs;
import fr.gabbler.models.User;

@WebServlet("/timeline")
public class TimelineServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String user = (String) req.getSession().getAttribute("username");

        GabDao gd = new GabDao();
        List<Gabs> gabs = gd.getListGabs(user);

        //Line which is generating the error
        gabs.get(1).getContent();


        req.setAttribute("gabs", gabs);


        req.getRequestDispatcher("/timeline.jsp").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doPost(req, resp);
    }
}

在位于 gabdao 的 servlet 中调用的函数:

public List<Gabs> getListGabs(String username){

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-pu");
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();

    userDao user = new userDao();
    int id = user.idFindByUsername(username);



    Query query = em.createQuery("select DISTINCT Id, content from Gabs as g where g.idUser = (select DISTINCT Id from User as u where u.Id = (select DISTINCT idFollowed from Follow as f where f.idFollower = :id ) )");
    query.setParameter("id", id );


    List<Gabs> gabs = (List<Gabs>) query.getResultList();

     return gabs;

}

在timeline.jsp 中,我有这个列表的代码,而没有timelineservlet 中的那一行,它会这样做:

Etat HTTP 500 - java.lang.NumberFormatException: For input string: "content"


<c:forEach items="${gabs}" var="t">
            <div class="container">
                <div id="gabs">
                ${t.content }
                </div>
            </div>
</c:forEach>

就是这样,列表有 2 个元素,gabs.size() 有效

我在网上搜索过,但没有找到任何可以帮助我的东西,这可能是因为列表的类型类似于 List 但 gabs 的类型是 List 所以我不知道

谢谢帮助我:)

错误及其发生的行意味着您的Query正在返回List<Object[]> - 引发错误的行是您实际尝试使用向下转换的List的值的第一个地方。

您从查询中获取一个数组,因为您的 SELECT 语句 根据规范有两列( Id, content )。 假设Id是主键, content是 Gabs 上的一个字段,您可能只想要

SELECT g from Gabs as g WHERE ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM