如何在 JSP 页面中显示 2 个表中的数据

Posted

技术标签:

【中文标题】如何在 JSP 页面中显示 2 个表中的数据【英文标题】:How to display data from 2 tables in JSP page 【发布时间】:2016-09-11 13:22:08 【问题描述】:

我是 Hibernate 和 Spring MVC 的新手。我正在创建一个 Web 应用程序,我想在其中显示所有电话号码的列表以及分配给每个号码的用户名。有 2 个表 - 一个用于数字,另一个用于用户。每个都由 id 索引。用户 ID 是数字表中的外键。当我尝试在 JSP 页面中显示名称时,我得到的只是用户的 id 表示,而不是返回数字列表时的名称值。是否有一个标准的休眠 CRUD 示例可以创建列表以包含用户的名称值而不是其 ID。表示?如果没有,有人可以帮我为此创建正确的查询程序吗?

我正在使用 Java 1.8、Spring 4.2.5、mysql 5.7 和 Hibernate 5.0.1 以及使用 Eclipse Mars IDE 的 Tomcat 8。

实体类:

@Entity
@Table(name="Numbers")
public class Numbers 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id", unique=true, nullable=false)
    private Long id;
    @Column(name="Number", nullable=false) 
    private String Number;  
    @Column(name="UserID", nullable=false)
    private Long UserID;    
    @ManyToOne
    @JoinColumn(name="FK_NUMBERS_USER")
    private Users Username;

//getters & setters


@Entity
@Table(name="Users")
public class Users 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id", unique=true, nullable=false)
    public Long id;

    @Column(name="Username", unique=true, nullable=false)
    public String Username;

        //getters & setters

控制器代码:

@RequestMapping(value="/numbers", method = RequestMethod.GET)
    public ModelAndView getAllNumbers() 

        List<Numbers> allNumbers = numbersService.findAllNumbers();

        ModelAndView model = new ModelAndView("numbers");
        model.addObject("numbers", allNumbers);

return model;

服务接口:

public interface NumbersService 

    void saveNumber(Numbers number);
    void deleteUser(Numbers number);
    List<Numbers> findAllNumbers();


JSP 文件 c:foreach:

table border="1">
             <tr>
                <th>Number</th>
                <th>Username</th>    
             </tr>
             <tbody>
                <c:forEach items="$numbers" var="numbers">
                    <tr>
                        <td>$numbers.id</td>
                        <td>$numbers.number</td>
                        <td>$numbers.username</td>
                    </tr>
                 </c:forEach>
              </tbody>            
            </table>

处理数字查询时控制器的控制台输出:

Number ID     Number      User ID
1           12055551212    1 
2           12065551212    2 
3           12075551212    1 

由于“userid”不是 Numbers 类的属性,并且如果在 JSP 中使用 numbers.username,表格字段为空白,因此我无法在 JSP 页面上获得相同的输出。如何获取 JSP 文件中的名称?

DAO 实现:

package com.voip.service.impl;


import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import com.voip.dao.NumbersDAO;
import com.voip.domain.Numbers;
import com.voip.domain.Users;
import com.voip.service.NumbersService;


public class NumbersServiceImpl implements NumbersService 


    @Autowired
    private NumbersDAO numbersDAO;


    @Override
    public List<Numbers> findAllNumbers() 

        List<Numbers> allNumbers = (List<Numbers>) numbersDAO.findAll();
        return allNumbers;


    


【问题讨论】:

【参考方案1】:

问题有两个方面。首先我在@JoinColumn 中设置了错误的值。该值应该引用我试图从中获取数据的表的主键。在我的情况下,Numbers 表正在尝试访问 Users 表,因此引用应该是“id”字段。

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="userid")
private Users userID;

其次,在我的 JSP 文件中,我需要确保引用正确的变量来检索数据。在这种情况下,变量将是用户 ID。此外,引用区分大小写。 JSP 文件应该有这个引用。

<td>$numbers.userID.username</td>

这让我可以在 JSP 文件中显示我想要的数字和用户名值。

【讨论】:

【参考方案2】:

    在多对一关系中添加@ManyToOne(fetch = FetchType.EAGER)

    同样在 JSP 中,用于获取用户名,更改 $numbers.username 到 $numbers.username.username

【讨论】:

试过了,但是 $numbers.username.username 数据的 JSP 仍然是空白

以上是关于如何在 JSP 页面中显示 2 个表中的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何将mysql数据库表中的内容显示在Web页面中,用啥软件实现呢?

我想从数据库表中选择最后 5 个条目并将其显示在页面上。如何使用 JSP 实现它?

如何合并 3 个表中的数据

如何将mysql数据库表中的内容显示在Web页面中,用啥软件实现呢?

如何从sql数据库中的2个表中获取多列数据?

如何在 Laravel 中将数据从 1 个视图插入到 2 个表中