如何使用SpringMVC在一个表中显示JSP页面上的两个表数据(子表和父表)

如何使用SpringMVC在一个表中显示JSP页面上的两个表数据(子表和父表),spring,hibernate,jsp,Spring,Hibernate,Jsp,我正在从事一个基于网上购物web应用程序的项目。在这个项目中,我使用Hibernate4.3和SpringMVC3.1。我有两个表,一个是Order表(orderid、customerid、dateorderplace、description),另一个是Customers表(父表)。 我想根据订单表的外键(customerid)显示订单和客户名称的完整详细信息,我能够在jsp页面上只显示客户id而不显示客户名称 订单表:- DROP TABLE IF EXISTS `pib`.`orders`;

我正在从事一个基于网上购物web应用程序的项目。在这个项目中,我使用Hibernate4.3和SpringMVC3.1。我有两个表,一个是Order表(orderid、customerid、dateorderplace、description),另一个是Customers表(父表)。 我想根据订单表的外键(customerid)显示订单和客户名称的完整详细信息,我能够在jsp页面上只显示客户id而不显示客户名称

订单表:-

DROP TABLE IF EXISTS `pib`.`orders`;
CREATE TABLE  `pib`.`orders` (
`orderid` int(10) unsigned NOT NULL auto_increment,
`customerid` int(10) unsigned NOT NULL,
`dateorderplaced` datetime default NULL,
`orderdetails` varchar(200) NOT NULL,
PRIMARY KEY  (`orderid`),
KEY `FK_orders_1` (`customerid`),
CONSTRAINT `FK_orders_1` FOREIGN KEY (`customerid`) REFERENCES `customers` (`customerid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
客户表:-

DROP TABLE IF EXISTS `pib`.`customers`;
CREATE TABLE  `pib`.`customers` (
`customerid` int(10) unsigned NOT NULL auto_increment,
`firstname` varchar(45) default NULL,
`lastname` varchar(45) default NULL,
`loginname` varchar(45) NOT NULL,
`loginpassword` varchar(45) NOT NULL,
`email` varchar(45) NOT NULL,
`mobile` varchar(13) default NULL,
`address` varchar(45) default NULL,
`city` varchar(45) default NULL,
`state` varchar(45) default NULL,
`pincode` varchar(45) default NULL,
`createddate` date default NULL,
`role` varchar(45) NOT NULL,
PRIMARY KEY  (`customerid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Order.java:-

public class Orders{
private Integer orderid;
 private Customers customers;
 private Date dateorderplaced;
 private String orderdetails;
//setters n getters
}
@Controller
public class AdminOrderController {
OrdersDAO ordersDAO;
CustomersDAO customersDAO;
@RequestMapping(value = "/vieworders.htm")
public ModelAndView prepareOrderList(){
    ModelAndView mav = new ModelAndView();
    mav.addAllObjects(prepareOrderModel());
    mav.setViewName("admin/vieworders");
    return mav;
}
Cutomers.java:-

public class Customers  implements java.io.Serializable {


 private Integer customerid;
 private String firstname;
 private String lastname;
 private String loginname;
 private String loginpassword;
 private String email;
 private String mobile;
 private String address;
 private String city;
 private String state;
 private String pincode;
 private Date createddate;
 private String role;
// setters n getters
}
AdminOrderController.java:-

public class Orders{
private Integer orderid;
 private Customers customers;
 private Date dateorderplaced;
 private String orderdetails;
//setters n getters
}
@Controller
public class AdminOrderController {
OrdersDAO ordersDAO;
CustomersDAO customersDAO;
@RequestMapping(value = "/vieworders.htm")
public ModelAndView prepareOrderList(){
    ModelAndView mav = new ModelAndView();
    mav.addAllObjects(prepareOrderModel());
    mav.setViewName("admin/vieworders");
    return mav;
}
我试图在jsp页面上显示的是orderid、客户的名字和姓氏或订单表的其他字段。希望你们明白我想做什么。提前谢谢

public Map prepareOrderModel(){
    Map map = new HashMap();
    map.put("orderList", ordersDAO.findAll());
    //map.put("customersList", customersDAO.findAll());
    return map;
}

<table>
        <tbody>
        <% i=0; %>
        <tr>
        <th>#</th>
        <th>Order ID</th>
        <th>Customer</th>
        <th>Date</th>

        </tr>
          <c:forEach items="${orderList}" var="ol">
        <tr>
        <td><%= ++i %></td>
        <td>${ol.orderid}</td>
        <td>${ol.customer}</td>
        <!-- <td>${ol.firstname}</td>
        <td>${ol.cutomers.firstname}</td> -->
        <td>${ol.dateorderplaced}</td>
       </tr>
       </c:foreach> </table>
publicmap prepareOrderModel(){
Map Map=newhashmap();
put(“orderList”,ordersDAO.findAll());
//put(“customersList”,customersDAO.findAll());
返回图;
}
#
订单号
顾客
日期
${ol.orderid}
${ol.customer}
${ol.dateorderplaced}

什么是${custName}?也许它应该是${ol.custName}或${ol.customer.custName}或其他什么

最好向我们展示
jsp
代码和
prepareOrderModel()
方法代码,而不是表映射。@VPK公共映射prepareOrderModel(){map map=new HashMap();map.put(“orderList”,ordersDAO.findAll());//map.put(“customersList”,customersDAO.findAll());返回map;}thnx用于responceeare您是否在
${ol.dateorderplacted}
中获取值?尝试使用${ol.customers.firstname}而不是${custName}。@VPK是的,我得到了这个值。@VPK我已经尝试过这种可能性。但不起作用。jsp中没有变量custName。如果您在orderList上循环并使用var=“ol”,那么所有数据都应该在ol中,并以${ol开头。请检查ordersDao.findAll()是否使用初始化的customers属性返回订单。因此,customers对象存在于Orders对象中,并设置了所有必要的属性?Hibernate设置数据,并且没有LazyInitalization?是的,所有属性都已设置,我还发布了控制器类和prepareOrderModel类。请检查它。我认为有另一种方法可以获得customers类pro例如firstname、lastname等特性。这可能是显而易见的,但如果您在调试期间检查客户数据,则应该可以,因为当您尝试在客户中检查字段时,则休眠获取此对象和数据,并且看起来所有数据都已设置。但是如果您按ordersDAO.findAll()获取订单如果Orders对象没有将客户设置为fetchMode=eager,那么客户将是唯一没有数据的代理。并且${ol.Customers.firstname}抛出LazyInitializationException。还有其他选项-数据库中没有客户或错误的客户id?