小弟刚出道的JAVA程序员,遇到了一个分页显示问题,全部查询的时候,分页没什么问题,可是面对一个多条件的查询分页显示,搞了一天的测试,知道了什么问题,但是去解决,以失败告终。好了废话不多说了,贴出来大家看看#11
头一次发帖子,见谅~ ~!
[img]http://dl.iteye.com/upload/attachment/352443/40f501dc-e2f2-3fbb-94e8-eacdbbfb5a71.jpg[/img]
分2种情况:
1. 都不填写值时,点击搜索,显示所有信息,并分页。
2. 4选1,4选2,4选3 或者都填写,点击搜索,根据所填值或者选择的值进行分页显示。
问题是,按理想的出结果了,但是,跳完action回来之后,下一页,数字转化异常。
限于文字的限制,只贴impl的代码:
JAVA代码 daoImpl
[img]http://dl.iteye.com/upload/attachment/352452/bff642a4-7e80-3e14-833f-28e19e4f38e5.jpg[/img]
JAVA代码 serviceImpl
[img]http://dl.iteye.com/upload/attachment/352454/ed9f560e-3604-376b-b161-244ddd93dead.jpg[/img]
JAVA代码 action
[img]http://dl.iteye.com/upload/attachment/352456/a3afe7fa-9e00-35e4-a02c-a057254991cf.jpg[/img]
[img]http://dl.iteye.com/upload/attachment/352469/d9f92cc8-070a-3618-bfaf-7d3d4149167f.jpg[/img]
jsp页面
[img]http://dl.iteye.com/upload/attachment/352463/9aaa8563-f813-3bb4-b206-f59b50873c08.jpg[/img]
完毕。
现在面临的问题是,点击下一页就报异常,在分页显示成功的情况下,上面那3个文本框和一个下拉中,没有填写或者选择的数据。
java.lang.NumberFormatException: null
java.lang.Integer.parseInt(Integer.java:415)
java.lang.Integer.parseInt(Integer.java:497)
com.eqixiu.action.FenYeAction.selectTuan(FenYeAction.java:86)
意思是那个 int type=Integer.parseInt(request.getParameter("type"));的错。
问题分析:1,下一页,参数的传法。2,使用js控制上面框框的值吗?
你是用Hibernate实现数据库访问的吧,Hibernate中专门有一个API是为了实现动态查询的功能的。Criteria.
[quote])特殊的HQL语句:
1>
org.hibernate Interface Criteria
org.hibernate.criterion Interface Criterion
org.hibernate.criterion.Restrictions
Criteria criteria=session.createCriteria(User.class);//查询User的所有对象,等价与createQuery("from User");
List<User> list=criteria.list();
Criterion c1=Restrictions.eq("name","java");//表示的是一种相等条件(典型的工厂方法);
前面是属性名.后面是对属性值的限制
Criterion c2=Restions.between("salary",10000,20000);
Criterion c3=Restrictions.lt();//表示的是一种小于的条件
criteria.add(c1);
criteria.add(c2);//add之后相当与在where语句之后增加了两个限制条件
这样的做法适合与动态查询的语句:比如查询满足特定条件的产品,只要判断某个条件是否填写,填写之后
生成对应的Criterion,然后加入到对应的Criteria当中即可,可以动态的增加SQL语句的Where子句
的限制条数,如果直接用HQL或SQL语句查询的话,则要不停的在代码中修改查询语句.
2>如何得到POJO的某个属性的值,而这个值未有数据库的表的字段与其对应
formula里出现的只能是表名,或者是字段名,绝对不能出现属性名
A:通过公式来换算
如果POJO的某个属性在数据库中不包含字段值,但是想通过其他的属性加上一个公式来换算出另外一个
属性的值.比如User类中有员工的工资以及员工的奖金.奖金想通过SQL语句直接换算出来,则要配置文件中加入
<property name="comm" formula="_salary*0.2"/>
B:通过子查询来实现
计算某个部门的员工的个数(在Dept中增加一个字段integer empNum)
映射文件的编写:
<property name="empNum" formula="(select count(*) from t_emp where e.dep_id=_id)"/>
//注意子查询的时候一定要加上小括号
注意:where子句后的限制条件都是列名而不是属性名
代码的实现:
Query query=session.createQuery("from Dept");
注意:Hibernate中有个Bug,数据库中的字段名是不能以"_"开头的,否则在做子查询的时候会造成查询结果的错误
如果上面的"_id"不加入別名的话,则该字段默认的別名是当前查询的表的字段,即t_emp的字段值,所以查询的
结果只会有1个.但实际上是要查询出的t_dept的id字段的值,如果不加下滑线,则Hibernate会自动帮你在生成
字段前会加上最外层的表的别名.dept_0.id.[/quote]
可以根据查询的条件是否为空,通过criteria.add(obj)来进行条件查询,当然可以配合分页一起做啦,腾讯QQ查询好友的功能就是这样实现的,你自己研究看看。呵呵·希望能帮助你·
你首先要判断你的type是否有值 你在转换 你那样转换 但你的type为空的时候肯定报错 判断 request.getParameter("type")); 等于null是 你就不转换 你加一个判断就好了
模糊查询分页的时候要带条件走。
你只是带了分页的参数,而查询条件并没有带走。
很多方法:
1.可以在.action后面并接查询参数。
eg:page.action?name="xxx"&age=11&pageNO=1&....
2.用表单提交.
上一页 下一页什么的··都用js方法。onclick="showPage(这里传过去第几页的);"
写一个隐藏表单,保存第几页的值。放在form中。然后在showPage方法中提交表单
showPage(){
submit();
}
记住:在action中需要把查询的值再传过来。在页面接收
eg:
应该说的够清楚了吧··
我一般分页用的是封装好的控件,没这么麻烦·
不需要在JSP页面上写上 sql语句·
只是把参数传到action中·查询出list后
再把参数传到jsp中 。
用第一种方法的话:
xxx.page.action?参数1=${参数1}&..有多少条件拼少.&pageNO={pageBean.currentBean}.
第二种的话:
eg
第一页
showPage(1){
//把传进来的 页数 赋给隐藏表单
//再提交···
}
...... //在写一个隐藏表单你得从第几条到第几条那两个字段在哪传过去得
生成连接的时候把下一页的参数丢进去即可。