从数据库中读取数据并存储在数组列表中,但数组列表显示为空

Posted

技术标签:

【中文标题】从数据库中读取数据并存储在数组列表中,但数组列表显示为空【英文标题】:Reading Data From Database and storing in Array List, but the array list is showing null 【发布时间】:2016-07-01 23:14:18 【问题描述】:

我正在尝试从 db 中检索数据并使用 JSP 以表格形式显示它。

问题是当我执行 query.list() 时它返回 null。

数据库中有10条记录。

如何检索所有记录?

下面是我的 DTO

public class TaskDAO 
    @SuppressWarnings("unchecked")
    public List<Task> getUserTasks(String userName) 
        // Task task = getTasksByUserName(userName);
        Configuration configuration = new Configuration().configure();
        SessionFactory sessionFactory = configuration.buildSessionFactory();

        Session session = sessionFactory.openSession();
        Transaction transaction = null;
        List<Task> task = new LinkedList<Task>();
        try 
             transaction = session.getTransaction();
            transaction.begin();
            Query query = session.createQuery("select id, taskDescription from Task where USERNAME='"
                    + userName + "'");
            task = query.list();
            transaction.commit();

         catch (Exception e) 
            if (transaction != null) 
                transaction.rollback();
            
            e.printStackTrace();
         finally 
            session.close();
        

        return task;

    


下面是我的 JSP

<%@page import="java.util.Iterator"%>
<%@page import="com.sk.app.dto.Task"%>
<%@page import="java.util.List"%>
<%@page import="com.sk.app.controller.Success"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Home Page</title>
</head>
<body>
<h2>Tasks</h2>
<table>
<%
List tasks =  (List)request.getAttribute("taskList");
Iterator iterator = tasks.iterator();
while (iterator.hasNext())
    Task currentTask = (Task) iterator.next();%>

    <tr>
        <td> <%=currentTask.getId()%></td>
        <td> <%=currentTask.getTaskDescription()%></td>
    </tr>
    <% %>
</table>

下面是我的 Servlet

public class Success extends HttpServlet 
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException 
        String userName = request.getParameter("userName");
        try 
            TaskDAO taskDAO = new TaskDAO();

            List<Task> taskList = taskDAO.getUserTasks(userName);

            request.setAttribute("taskList", taskList);
            Iterator<Task> iterator = taskList.iterator();
            int count = 0;
            while (iterator.hasNext())
                count ++;
            
            System.out.println(count);
            RequestDispatcher requestDispatcher = request
                    .getRequestDispatcher("task.jsp");

            requestDispatcher.forward(request, response);
         catch (Exception e) 

            e.printStackTrace();
        

    

下面是我的任务 dto

public class Task 
    private int id;
    private String taskDescription;
    private String USERNAME;
    public String getUserName() 
        return USERNAME;
    
    public void setUserName(String userName) 
        this.USERNAME = userName;
    
    public int getId() 
        return id;
    
    public void setId(int id) 
        this.id = id;
    
    public String getTaskDescription() 
        return taskDescription;
    
    public void setTaskDescription(String taskDescription) 
        this.taskDescription = taskDescription;
    
    @Override
    public String toString() 
        return "Task [id=" + id + ", taskDescription=" + taskDescription
                + ", USERNAME=" + USERNAME + "]";
    



当我调试程序时,这是我检查 task = query.list(); 得到的结果

下图是表结构,用户名列是用户表的外键。

【问题讨论】:

这是一个巨大的“不要那样做”的集合。不要使用 scriptlet,不要使用字符串粘贴来生成查询,不要手写事务管理或 DAO,不要手动编写 servlet。我可以用大约 10 行 Spring 和 10 行 HTML 模板替换你的整个代码。 @chrylis 我是新手,从头开始学习。尝试实施我学到的东西。 【参考方案1】:

显然,您没有从数据库中获取任何数据,因为您的HQL 不正确。你需要得到所有Task

Query query = session.createQuery("from Task where USERNAME='"
                    + userName + "'");

检查您的财产USERNAME。它必须是持久类属性,而不是数据库列!

只需使用transaction = session.beginTransaction(); 代替

transaction = session.getTransaction();
transaction.begin();

使用List&lt;Task&gt; task = null; 代替

List<Task> task = new LinkedList<Task>();

【讨论】:

还是一样,返回null。 @ShashiKiran 这样做System.out.println(session.createQuery("from Task where username='3'").list()); 这是我得到的输出 ' [com.sk.app.dto.Task@7a87274f, com.sk.app.dto.Task@3f25f261, com.sk.app.dto.Task @544bdeaa, com.sk.app.dto.Task@41079622, com.sk.app.dto.Task@5911b388] '这不正确吗? 我创建了 toString 方法,这是之后的输出 - '[Task [id=1, taskDescription=null, USERNAME=null], Task [id=3, taskDescription=null, USERNAME= null],任务 [id=7,taskDescription=null,USERNAME=null],任务 [id=9,taskDescription=null,USERNAME=null],任务 [id=10,taskDescription=null,USERNAME=null]]' @ShashiKiran 看起来,您从数据库中获取数据。请在您的问题中添加Task

以上是关于从数据库中读取数据并存储在数组列表中,但数组列表显示为空的主要内容,如果未能解决你的问题,请参考以下文章

从本地存储中一一检索数组列表

将结果存储在数组列表中

如何在 javascript 中读取对象文件列表数组?

如何在本机反应中从平面列表中设置 Json 数组

如何将文件的内容添加到数组列表中

Java IO学习--字节和字符数组