教师id是学生表的外键,现在前台打印学生列表,要显示学生信息和教师姓名。dao层把联合查询结果往上return时,是一个学生实体类。而学生类只有教师id没有教师名,那么如何在前端显示教师名?我现在的做法是在学生实体上加个教师名的字段,但这样就和数据库表的字段不统一了,请问这个问题一般怎么解决?

解决方案 »

  1.   

    通过id得到教师这个po
    然后通过po得到教师名字
      

  2.   

    直接用sql语句学生表student
    id name sex age address  techid教师表teacherid  name  sex age address
    select student.name,teacher.name from student left join teacher on student.techid=teacher.id 
      

  3.   

    你用的是hibernate吧,如果是的话就简单了,直接改一下学生.hbm.xml中的<many-to-one...>里面的一个属性:lazy=false,然后在.java就可以直接stu.teacher.tname了
      

  4.   

    直接返回一个map,不是很简单吗,遍历的时候也用map不就OK了。不过用map比较麻烦的一点是大小写必须一致
      

  5.   

    用map的话,map里放的是什么类型啊?student类里没有教师名字啊
      

  6.   


    有点不解,楼主所谓的联合查询是什么?我就想不通了,dao层难道就不能返回个Object数组啊?
    你有200个实体类,你dao层还要写200个返回实体的方法啊?
      

  7.   

    哦,是我说错了,我的意思是连接查询,我说成union联合查询了不太清楚你的意思啊,返回Object,前端打印时不还是得转型成学生类吗?但学生类没有教师名字
      

  8.   

    JSP,就是在一个jsp页面打印一个学生的信息
      

  9.   

    学生有自己的实体类吧?VO或者PO对象,按照3楼的那个完全可以拿到值,然后放到这个vo对象里,在jsp页面用jstl标签遍历下就可以了吧
      

  10.   

    惭愧啊,小的新手一个,还没学到框架呢。我觉得奇怪,这个应该是个普遍的问题,但我在网上也没搜到相关结果,大概因为都用hibernate去了吧
      

  11.   

    在查询的时候用sql把学生和教师的信息都查询出来放在list中啊,
    List<Object[]> mmsList = query.list();
    for (Object[] obj : mmsList) {
     System.out.println(obj[0]);//你查的值有几列就继续obj[0]
     
    }
      

  12.   

    也不是,servlet也是可以用的,不过用到VO对象,和hibernate的PO差不多比如说,你拿到这个学生的信息后,是一个list,或者说,是一个VO对象,这样很容易就在页面上获取到了,
    ${}标签完全可以,后台,3楼的方法是可以的,只是查询一些信息,然后关联老师表,查询的信息,最后都扔到session里,然后在前台显示就可以了PS:不解的是,老师和学生应该是多对多吧,为什么不弄一张中间表呢
      

  13.   

    我只记得,有一个方法,是查询出值之后,然后取出每列的数据,然后把这列的数据,你可以全部传出去,也可以set到vo对象里,然后在传到前台,但是方法好久没用,忘记了,大概是result这样的,具体忘记了
      

  14.   

    package com.servlet;import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;/**
     * @author NONE
     * @date 2011-11-04
     */
    public class DataServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    List<Object[]> objArray=getDateSource();
    req.setAttribute("objArray", objArray);
    req.getRequestDispatcher("resultData.jsp").forward(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    doPost(req, resp);
    }
    /**
     * 获得数据源
     * 实际上这些数据都是你从数据中查出来,
     * 我现在只是模拟的做几个数据
     * @return
     */
    private List<Object[]> getDateSource()
    {
    List<Object[]> list=new ArrayList<Object[]>();
    Object[] obj1={"1","孙悟空","唐僧"};
    Object[] obj2={"1","猪八戒","唐僧"};
    Object[] obj3={"1","沙和尚","唐僧"};
    list.add(obj1);
    list.add(obj2);
    list.add(obj3);
    return list;

    }}
    前台jsp<%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.util.*" %>
    <!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=UTF-8">
    <title>Insert title here</title>
    </head>
    <body><table>
    <tr><td>编号</td><td>学生姓名</td><td>老师姓名</td></tr>
    <%
    List<Object[]> objArray=(List<Object[]>)request.getAttribute("objArray");
    for(int i=0;i<objArray.size();i++)
    {
    Object[] obj = objArray.get(i);
    %>
    <tr><td><%=obj[0].toString() %></td><td><%=obj[1].toString() %></td><td><%=obj[2].toString() %></td></tr>
    <% 
    }%>
    </table></body>
    </html>
    结果编号 学生姓名 老师姓名 
    1 孙悟空 唐僧 
    1 猪八戒 唐僧 
    1 沙和尚 唐僧 
      

  15.   

    package com.servlet;import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;/**
     * @author NONE
     * @date 2011-11-04
     */
    public class DataServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    List<Object[]> objArray=getDateSource();
    req.setAttribute("objArray", objArray);
    req.getRequestDispatcher("resultData.jsp").forward(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    doPost(req, resp);
    }
    /**
     * 获得数据源
     * 实际上这些数据都是你从数据中查出来,
     * 我现在只是模拟的做几个数据
     * @return
     */
    private List<Object[]> getDateSource()
    {
    List<Object[]> list=new ArrayList<Object[]>();
    Object[] obj1={"1","孙悟空","唐僧"};
    Object[] obj2={"1","猪八戒","唐僧"};
    Object[] obj3={"1","沙和尚","唐僧"};
    list.add(obj1);
    list.add(obj2);
    list.add(obj3);
    return list;

    }}前台jsp<%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.util.*" %>
    <!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=UTF-8">
    <title>Insert title here</title>
    </head>
    <body><table>
    <tr><td>编号</td><td>学生姓名</td><td>老师姓名</td></tr>
    <%
    List<Object[]> objArray=(List<Object[]>)request.getAttribute("objArray");
    for(int i=0;i<objArray.size();i++)
    {
    Object[] obj = objArray.get(i);
    %>
    <tr><td><%=obj[0].toString() %></td><td><%=obj[1].toString() %></td><td><%=obj[2].toString() %></td></tr>
    <% 
    }%>
    </table></body>
    </html>结果编号 学生姓名 老师姓名 
    1 孙悟空 唐僧 
    1 猪八戒 唐僧 
    1 沙和尚 唐僧 
      

  16.   

    目前做web开发,很少不用框架的了,我上面写的还是最基本的jsp+servlet
    如果用框架的话,就不会这么麻烦了,前台也不会出现java代码了,像现在用的比较多的struts2,前台很多东西都直接写标签了!
      

  17.   

    感谢各位回复,原来是把list的类型变成Object数组了。之前我看的教程都是在servlet里把list<实体类>放进request的,所以一直不理解