如下,有几张表:
表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: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 不知道意思有没有表达完整,求帮忙
解决方案 »
- 求助
- 求助MySql:No Dialect mapping for JDBC type: -1
- 求MagicDrawUML建模工具的使用手册(中文)
- 新手请教:我的文本框出错,不知为什么,请教各位,多谢!
- cocoon如何使用?哪位高手指条路
- jbuilder6小问题
- EJB 错误
- 运行Apache2,打开浏览器,在地址栏中输入:http://localhost 检验看不到Apache2的欢迎界面?帮忙呀(80分)!!!
- 你们怎么用 JBuilder 做 EJB 的?是不是没有 VisiBroker 就做不成了?请高手介绍一下经验郁闷死了
- tomcat 配置内存大小
- 用ibatis连接数据库插入数据时页面报错!!求各位大神解决下!!!!
- java通过tuxedo上传下载文件的问题
——意思是 价值 = 资产 ÷ 负债 ?我想比较报告期为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'
from FinanceSummary fs,
BasicInfo bi
where fs.balanceSheet.StockData = bi.stockData
and fs.balanceSheet.报告期 = '2012-03-01'
and fs.价值 > bi.价格
<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>
var的?只是相当于一个变量,关键还是看pm.datas是什么类型,就相当于
for (类型 ? : pm.datas) 这样的遍历,所以问题不在?是什么,而是在于pm.datas是什么类型的集合
/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有关系的代码应该就这些了
PagerModel pm = new PagerModel();
pm.setTotal(total);
pm.setDatas(datas); //从这里可以看出datas就是query的结果集对于3L的例子,query的结果集是个List<Object[]>,Object[0]是FinanceSummary对象,Object[1]是BasicInfo对象
for (Object o : pm.datas) {
if (o instanceof Object[]) {
Object[] oa = (Object[]o);
FinanceSummary fs = (FinanceSummary)oa[0];
BasicInfo bi = (BasicInfo)oa[1];
...
}
}
这种情况下,可能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>
......
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>
第二种成功,说明jstl后台是通过反射去处理的,所以只要后台取到的类型和属性一致,就能正常处理了
那就用第二种吧,第二种看起来代码统一