如下,有几张表:
表1:StockData
id stockDataId stockDataName
1 600000           深发展表二:BasicInfo
id 价格    stockData
1 8.00    1表三:BalanceSheet
id 报告期        资产 负债 StockData
1 2012-01-01 200 100 1
2 2012-03-01 900 100 1表四:FinanceSummaryid 价值 balanceSheet
1 2.00 1
2 9.00    2大概就是这个关系,表四中的“价值”,是由表三种“资产/负债”计算得来的,表二和表一是一对一单向关联,现在我想比较报告期为2003-03-01,FinanceSummary中的“价值”条目大于BasicInfo中“价格”条目,并获得结果,应该怎么查询。
网页中我想这样展现:
搜索之前:序号 股票代码 股票名称 报表日期        现价 价值
1 600000 浦发银行 2012-01-01 8.00 2.00
                2012-03-01      8.00    9.00
搜索之后:
序号 股票代码 股票名称 报表日期        现价 价值
1 600000 浦发银行 2012-03-01 8.00 9.00 不知道意思有没有表达完整,求帮忙

解决方案 »

  1.   

    表四中的“价值”,是由表三种“资产/负债”计算得来的
    ——意思是 价值 = 资产 ÷ 负债 ?我想比较报告期为2003-03-01,FinanceSummary中的“价值”条目大于BasicInfo中“价格”条目
    ——你这个需求,直接用表4的“价值”字段就可以了吧?还是要用表三来计算?
    大致如下:
    Select sd.stockDataId, sd.stockDataName, bs.报告期, fs.价值, bi.价格
    From StockData sd 
      inner join BasicInfo bi on sd.id = bi.id
      inner join BalanceSheet bs on sd.id = bs.StockData
      inner join FinanceSummary fs on bs.id = fs.balanceSheet
    Where fs.价值 >= bi.价格
      and bs.报告期 = '2012-03-01'
      
      

  2.   

    上面这段语句如果转换成HQL语句,应该是什么样子的啊,我发在我的代码里老出错ERROR org.hibernate.hql.PARSER:33 - line 1:105: unexpected token: on
      

  3.   

    HQL的话,如果表的映射关系都有配置好,直接select entity就可以了,然后通过实体关联取相应的entity信息就可以了以LZ的检索条件为例在我想比较报告期为2003-03-01,FinanceSummary中的“价值”条目大于BasicInfo中“价格”条目,并获得结果,应该怎么查询。select fs, bi 
      from FinanceSummary fs,
           BasicInfo bi
     where fs.balanceSheet.StockData = bi.stockData
       and fs.balanceSheet.报告期 = '2012-03-01'
       and fs.价值 > bi.价格
      

  4.   

    如果用如上方法检索,那我网页中的“?”处应该怎么填呢?,我试了好多种都不多
    <c:if test="${!empty pm.datas}">
              <c:forEach items="${pm.datas }" var="?" >
          <tr bgcolor="#EFF3F7" class="TableBody1" onMouseOver="this.bgColor = '#DEE7FF';" onMouseOut="this.bgColor='#EFF3F7';">
          <td align="center" vAlign="center">${?}</td> 
            </tr>
            </c:forEach>
    </c:if>
      

  5.   

    pm.datas返回的是一个什么样的集合?
    var的?只是相当于一个变量,关键还是看pm.datas是什么类型,就相当于
    for (类型 ? : pm.datas) 这样的遍历,所以问题不在?是什么,而是在于pm.datas是什么类型的集合
      

  6.   

    呵呵,我是直接套用尚学堂的OA的代码修改的,
    /stock_0117-1/src/com/tjhyzg/stock/managers/impl/AbstractManager.javapackage com.tjhyzg.stock.managers.impl;import java.util.List;import org.hibernate.Query;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.tjhyzg.stock.PagerModel;
    import com.tjhyzg.stock.SystemContext;
    import com.tjhyzg.stock.managers.SystemException;public class AbstractManager extends HibernateDaoSupport {

    public PagerModel searchPaginated(String hql) {
    return searchPaginated(hql,null,SystemContext.getOffset(),SystemContext.getPagesize());
    }

    public PagerModel searchPaginated(String hql,Object param) {
    return searchPaginated(hql,new Object[]{param},SystemContext.getOffset(),SystemContext.getPagesize());
    }

    public PagerModel searchPaginated(String hql,Object[] params) {
    return searchPaginated(hql,params,SystemContext.getOffset(),SystemContext.getPagesize());
    }

    public PagerModel searchPaginated(String hql,int offset,int pagesize) {
    return searchPaginated(hql,null,offset,pagesize);
    }

    public PagerModel searchPaginated(String hql, Object obj, int offset, int pagesize) {
    return searchPaginated(hql,new Object[] {obj},offset,pagesize);
    }
    /**
     * 根据HQL语句进行分页查询
     * @param hql HQL语句
     * @param params HQL语句带的几个参数值
     * @param offset 从第几条记录开始查询
     * @param pagesize 每页显示多少行
     * @return
     */
    public PagerModel searchPaginated(String hql,Object[] params,int offset,int pagesize) {

    //获取记录总数
    String countHql = getCountQuery(hql);
    Query query = getSession().createQuery(countHql);
    if(params != null && params.length>0) {
    for(int i=0;i<params.length;i++) {
    query.setParameter(i, params[i]);
    }
    }
    int total = ((Long)query.uniqueResult()).intValue();

    //获取当前页的结果集
    query = getSession().createQuery(hql);
    if(params != null && params.length>0) {
    for(int i=0;i<params.length;i++) {
    query.setParameter(i, params[i]);
    }
    }

    query.setFirstResult(offset);
    query.setMaxResults(pagesize);
    List datas = query.list();

    PagerModel pm = new PagerModel();
    pm.setTotal(total);
    pm.setDatas(datas);
    return pm;
    }

    /**
     * 根据HQl语句,获得查找总记录数的HQL语句
     * 如:
     * from Organization o where o.parent is null
     * 进过转换,可以得到:
     * select count(*) from Organization o where o.parent is null
     * @param hql
     * @return
     */
    private String getCountQuery(String hql) {
    int index = hql.indexOf("from");
    if(index != -1) {
    return "select count(*) " + hql.substring(index);
    }

    throw new SystemException("无效的HQL查询语句!");
    }
    }/stock_0117-1/src/com/tjhyzg/stock/PagerModel.javapackage com.tjhyzg.stock;import java.util.List;public class PagerModel {

    /**
     * 总记录数
     */
    private int total;

    /**
     * 当前页结果集
     */
    private List datas; public int getTotal() {
    return total;
    } public void setTotal(int total) {
    this.total = total;
    } public List getDatas() {
    return datas;
    } public void setDatas(List datas) {
    this.datas = datas;
    }

    }/stock_0117-1/src/com/tjhyzg/stock/SystemContext.javapackage com.tjhyzg.stock;public class SystemContext {
    private static ThreadLocal offset = new ThreadLocal();
    private static ThreadLocal pagesize = new ThreadLocal();

    public static int getOffset() {
    Integer os = (Integer)offset.get();
    if(os == null) {
    return 0;
    }
    return os;
    }

    public static void setOffset(int offsetvalue) {
    offset.set(offsetvalue);
    }

    public static void removeOffset() {
    offset.remove();
    }

    public static int getPagesize() {
    Integer ps = (Integer)pagesize.get();
    if(ps == null) {
    return Integer.MAX_VALUE;
    }
    return ps;
    }

    public static void setPagesize(int pagesizevalue) {
    pagesize.set(pagesizevalue);
    }

    public static void removePagesize() {
    offset.remove();
    }
    }跟pm.datas有关系的代码应该就这些了
      

  7.   

    List datas = query.list();
            
            PagerModel pm = new PagerModel();
            pm.setTotal(total);
            pm.setDatas(datas); //从这里可以看出datas就是query的结果集对于3L的例子,query的结果集是个List<Object[]>,Object[0]是FinanceSummary对象,Object[1]是BasicInfo对象
      

  8.   

    楼上意思是,我要改写AbstractManager.java的代码吗
      

  9.   

    不需要改写,只是告诉你,pm.datas集合里保存的是Object数组,数组的第一个元素是FinanceSummary对象,第二个元素是BasicInfo,即遍历的时候可以如下
    for (Object o : pm.datas) {
        if (o instanceof Object[]) {
            Object[] oa = (Object[]o);
            FinanceSummary fs = (FinanceSummary)oa[0];
            BasicInfo bi = (BasicInfo)oa[1];
            ...
        }
    }
      

  10.   

    那我想在网页中遍历显示出这些数据应该怎么搞呢,先把这段代码放在<%%>中吗
      

  11.   


    这种情况下,可能jstl满足不了,需要结合<%%>一起使用<c:if test="${!empty pm.datas}">
              <c:forEach items="${pm.datas}" var="data" >
              <tr bgcolor="#EFF3F7" class="TableBody1" onMouseOver="this.bgColor = '#DEE7FF';" onMouseOut="this.bgColor='#EFF3F7';">
                  <% 
                      Object[] oa = (Object[])pageContext.getAttribute("data");
                      FinanceSummary fs = (FinanceSummary)oa[0];
                      BasicInfo bi = (BasicInfo)oa[1];
                  %>
                  <td align="center" vAlign="center"><%=bi.stockData.id%></td>
                  <td align="center" vAlign="center"><%=bi.stockData.stockDataId%></td>
                  ...
              </tr>
            </c:forEach>
            </c:if>不知道<c:set>能不能类型转换,LZ可以试试看<c:forEach items="${pm.datas}" var="data" >
              <tr bgcolor="#EFF3F7" class="TableBody1" onMouseOver="this.bgColor = '#DEE7FF';" onMouseOut="this.bgColor='#EFF3F7';">
              <c:set var="fs" value="${data[0]}" />
              <c:set var="bi" value="${data[1]}" />
              <td align="center" vAlign="center">${bi.stockData.id}</td>  
              ......
      

  12.   

    貌似都不行,如下显示严重: Servlet.service() for servlet jsp threw exception
    org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: 100 in the jsp file: /financesummary/index_compare.jsp
    FinanceSummary cannot be resolved to a type
    97:        <tr bgcolor="#EFF3F7" class="TableBody1" onMouseOver="this.bgColor = '#DEE7FF';" onMouseOut="this.bgColor='#EFF3F7';">
    98:        <% 
    99:                   Object[] oa = (Object[])pageContext.getAttribute("data");
    100:                   FinanceSummary fs = (FinanceSummary)oa[0];
    101:                   BasicInfo bi = (BasicInfo)oa[1];
    102:               %>
    103:        <td align="center" vAlign="center"><%=fs.stockData.id%></td>  An error occurred at line: 101 in the jsp file: /financesummary/index_compare.jsp
    BasicInfo cannot be resolved to a type
    98:        <% 
    99:                   Object[] oa = (Object[])pageContext.getAttribute("data");
    100:                   FinanceSummary fs = (FinanceSummary)oa[0];
    101:                   BasicInfo bi = (BasicInfo)oa[1];
    102:               %>
    103:        <td align="center" vAlign="center"><%=fs.stockData.id%></td> 
    104:        <td align="center" vAlign="center"></a></td>   
      

  13.   

    第一种显示上面的错误,第二种用<c:set>却成功了,呵呵
      

  14.   

    第一种错误,是因为你的jsp没有import相关的类
    第二种成功,说明jstl后台是通过反射去处理的,所以只要后台取到的类型和属性一致,就能正常处理了
    那就用第二种吧,第二种看起来代码统一