㈠ 如何解决hibernate对于sqlserver分页查询的效率问题
1.肯孝雹定一下,那个告诉你是假分页的人是正确的,通过你打印的SQL应该是假分页。因为桥指在内层已经查询了全部select t.* from user_view t 这个地方没有分页。
2.效率问题是因为你的基数不够大,可以尝试下数据库单表100W数据量,然后你在对比下两个SQL的效率,答案是肯定的。第巧消帆二个效率肯定高。
㈡ hibernate+struts2分页查询的问题,永远都是第一页,为什么第一条sql语句对,第二条变样了
因为sql server 没有直接的分页功能,hibernate 采用了top的方式进行间接的分页方式,第一页top pageSize,第二页 top pageSize*2,但前pageSize条记录被丢弃了,第二页的数据是从pageSize+1开始取的.
同理,第三页的数据查询了pageSize*3条数据,前pageSize*2条记录丢弃,只要pageSize*2+1到pageSize*3之间的数据...
㈢ hibernate中分页查询怎么做的
Hirbernate ,芹穗它自带郑正分页API
例如:
Query q = sess.createQuery("from XXX");
q.setFirstResult(20);设置起始行嫌丛卜
q.setMaxResults(10);每页条数
List cats = q.list(); //得到每页的数据
㈣ hibernate中纯sql语句查询,当分页的时候会第二页以后会多出一列行号(包含第二页)
hibernate 分页查询的时候会将你的查询语句结果作为结果集然后在此之上查询*
select * from (***********) where rownum<30(←这是第一页每页三十个)
select * from
(
select * from (***********) where rownum<60
)
where rownum_>30(←这是第二页每页三十个)
所以多出来一列 具体解决方式....... 我也不太清楚我也碰到了这个问题 原因找到了 我正在想办法处理
㈤ hibernate中分页查询怎么做的
Query query= session.createQuery("sql 语句");
query.setFirstResult(起哗枣始位置);//就是说你的从第几条开始
query.setMaxResults(页面显示条数);//页面默认显示凳芦滑的条数
List cats = query.list();
返回枣腊的结果就是你想要的分页后的集合
㈥ 如何用 Hibernate 实现分页查询
例如 从第 万条开始取出 条记录代码:Query q = session createQuery( from Cat as c );q setFirstResult( );q setMaxResults( );List l = q list();那么Hibernate底层如何实现分页的呢?实际上Hibernate的查询定义在net sf hibernate loader Loader这个类里面 仔细阅读该类代码 就可以把问题彻底搞清楚 Hibernate 的Loader源代码第 行以下 代码:if (useLimit) sql = dialect getLimitString(sql);PreparedStatement st = session getBatcher() prepareQueryStatement(sql scrollable);如果相应的数据库定义了限定查询记录的sql语句 那么直接使用特定数据库的sql语句 然后来看net sf hibernate dialect MySQLDialect:代仿运码:public boolean supportsLimit() {return true;察耐}public String getLimitString(String sql) {StringBuffer pagingSelect = new StringBuffer( );pagingSelect append(sql);pagingSelect append( limit ? ? );return pagingSelect toString();}这是MySQL的专用分页语句 再来看net sf hibernate dialect Oracle Dialect:代码:public boolean supportsLimit() {return true;}public String getLimitString(String sql) {StringBuffer pagingSelect = new StringBuffer( );pagingSelect append( select * from ( select row_ * rownum rownum_from ( );pagingSelect append(sql);pagingSelect append( ) row_ where rownum <= ?) where rownum_ > ? );return pagingSelect toString();}Oracle采用嵌套 层的查询语句结合rownum来实备没梁现分页 这在Oracle上是最快的方式 如果只是一层或者两层的查询语句的rownum不能支持order by 除此之外 Interbase PostgreSQL HSQL也支持分页的sql语句 在相应的Dialect里面 大家自行参考 如果数据库不支持分页的SQL语句 那么根据在配置文件里面#hibernate jdbc use_scrollable_resultset true默认是true 如果你不指定为false 那么Hibernate会使用JDBC 的scrollableresult来实现分页 看Loader第 行以下 代码:if ( session getFactory() useScrollableResultSets() ) {// we can go straight to the first required rowrs absolute(firstRow);}else {// we need to step through the rows one row at a time (slow)for ( int m= ; m<firstRow; m++ ) rs next();}如果支持scrollable result 使用ResultSet的absolute方法直接移到查询起点 如果不支持的话 使用循环语句 rs next一点点的移过去 可见使用Hibernate 在进行查询分页的操作上 是具有非常大的灵活性 Hibernate会首先尝试用特定数据库的分页sql 如果没用 再尝试Scrollable 如果不行 最后采用rset next()移动的办法 在查询分页代码中使用Hibernate的一大好处是 既兼顾了查询分页的性能 同时又保证了代码在不同的数据库之间的可移植性 lishixin/Article/program/Java/ky/201311/28262
㈦ hibernate的三种查询方式
1.1、SQL概述
HQL是Hibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL接近SQL`语句查询语法。
完整的HQL语句形式如下:
select | update | delete … from … where … group by … having … order by … asc|desc
其中的update、delete为Hibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。HQL查询在整个Hibernate实体操作体系中占核心地位。
String hql = "HQL语句";
Query query = session.createQuery(hql);
List list = query.list(); //查询得到多个实体对象集合
Object result = query.uniqueResult(); //查询得到一个实体对象
int x = query.executeUpdate(); //执行update或delete语句,返回数据表受影响行数
1.2、实体查询
查询过程中表名使用类名,列名使用属性名,类名和属性名称区分大小写
String hql="from Users";//from 实体类类型名称
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
1.3、带where的查询
Query query = session.createQuery("from Users where uid=3");
Users user = (Users) query.uniqueResult();//uniqueResult 单一对象
System.out.println(user);
Query query = session.createQuery("from Users where uid>5");
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
1.3、属性查询
查询部分属性
String hql="select u.uid,u.uname,u.upwd from Users u where u.uname='张三'";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
String hql="select new Users(u.uname,u.upwd) from Users u where u.uname='张三'";
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
1.4、实体的更新和删除
从hibernate 3版本开始才支持
//更新
String hql="update Users set uname='王五',upwd='321' where uid=3";
int res = session.createQuery(hql).executeUpdate();
//删除
String hql="delete from Users where uid=3";
int res = session.createQuery(hql).executeUpdate();
/*
返回值结果:
正整数:表受影响的行数据
0: 语句正常执行,但没有行受影响
负整数:通常是-1,执行HQL语句是一条查询语句
*/
HQL语句不能做添加
1.5、分组与排序
排序
处理方式和SQL语句中的排序是一样的
String hql="from Users order by uid";
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
order by语句只能出现在语句的最后位置
分组
处理方式和SQL语句中分组查询相同
分组语句需要处理筛选,只能使用having语句,而不能使用where语句。
String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno";
String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno having count(e)>=5";
1.6、参数绑定
使用占位参数
String hql="from Users where uid=? or uname=?";
Query query = session.createQuery(hql);
//索引从0开始
query.setInteger(0, 3);//query.setParameter(0, 3);
query.setString(1, "张三");//query.setParameter(1, "张三");
List<Users> list = query.list();
for (Users user : list) {
System.out.println(user);
}
使用参数名称
String hql = "from Users where uid=:no1 or uid=:no2";
Query query = session.createQuery(hql);
query.setInteger("no1", 1);
query.setInteger("no2", 3);
//....
可以使用点位参数和名称参数混合使用
String hql = "from User where uid=? or uid=:no2";
Query query = session.createQuery(hql);
query.setInteger(0, 7788);
query.setInteger("no2", 7566);
//....
//使用点位参数和名称参数混合使用,所有点位参数必须放在前面,一旦有名称参数出现,其后将不能再出现占位参数
1.7、连接查询
--SQL语句:查询员工姓名、薪资、部门名称
SELECT ENAME,SAL,DNAME
FROM EMP e JOIN DEPT d ON e.DEPTNO=d.DEPTNO
SELECT ENAME,SAL,DNAME FROM EMP,DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO
没有on语句
能被连接到查询中的必须是主查询对象的子属性
String hql="SELECT e.ename, e.sal, e.dept.dname FROM Emp e";
//HQL连接查询
String hql="SELECT e.ename, e.sal, d.dname FROM Emp e JOIN e.dept d";
String hql = "SELECT e FROM Emp e JOIN e.dept"; //JOIN将没有意义
String hql = "FROM Emp e JOIN e.dept";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
//List集合中的数组中会保存两个元素:
//0:主数据(Emp)
//1:从数据(Dept)
//查询编号为7788的员工信息,同时将对应的dept信息和manager信息查询并保存在对应的子属性中
String hql = "FROM Emp e JOIN FETCH e.dept d JOIN FETCH e.manager m WHERE e.empno=7788";
Query query = session.createQuery(hql);
Emp emp = (Emp) query.uniqueResult();
System.out.println(emp);
System.out.println(emp.getManager());
System.out.println(emp.getDept());
1.8、分页
String hql = "from Users";
Query query = session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(2);
2、QBC查询
QBC(Query By Criteria)查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。
QBC查询最重要的三个类:
Restrictions 条件限制
Projections 列设射
Order 排序
2.1、查询实现
Criteria criteria = session.createCriteria(Users.class);
//session.createCriteria("entity.Users");
//session.createCriteria(Users.class, "别名");
List<Dept> list = criteria.list();
//查询单行结果(如果结果有两行或更多,会报错)
Object uniqueResult = criteria.uniqueResult();
2.2、Projections 列投射
语法:
//查询uname属性
Criteria criteria = session.createCriteria(Users.class);
PropertyProjection property = Projections.property("name");
criteria.setProjection(property);
List<Object> result = criteria.list();
//查询uname, upwd属性
Criteria criteria = session.createCriteria(Users.class);
//1.创建投射列表
ProjectionList projectionList = Projections.projectionList();
//2.向投射列表中添加列投射
PropertyProjection property1 = Projections.property("uname");
PropertyProjection property2 = Projections.property("upwd");
projectionList.add(property1).add(property2);
//3.将投射列表设置到准则中
criteria.setProjection(projectionList);
List<Object> result = criteria.list();
返回值类型 方法名称 描述
PropertyProjection Projections.property 指定某属性
AggregateProjection Projections.avg 求平均值
CountProjection Projections.count 统计某属性的数量
CountProjection Projections.countDistinct 统计某属性不同值的数量
PropertyProjection Projections.groupProperty 指定某个属性为分组属性
AggregateProjection Projections.max 求最大值
AggregateProjection Projections.min 求最小值
ProjectionList Projections.projectionList 创建一个ProjectionList对象
Projection Projections.rowCount 查询结果集中的记录条数
AggregateProjection Projections.sum 求某属性的合计
2.3、Restrictions 条件限制
语法:
Criteria criteria = session.createCriteria(Users.class);
Criterion notNull = Restrictions.isNotNull("comm");
criteria.add(notNull); //添加一个条件(如果添加了多个条件,默认条件之间使用and连接)
List<Users> list = criteria.list();
返回值类型 方法名称 描述
SimpleExpression Restrictions.eq 等于(equal)
Criterion Restrictions.allEq 使用Map,Key/Valu进行多个等于的比对
SimpleExpression Restrictions.gt 大于(great than)
SimpleExpression Restrictions.ge 大于等于(great than or equal)
SimpleExpression Restrictions.lt 小于(less than)
SimpleExpression Restrictions.le 小于等于(less than or equal)
Criterion Restrictions.between 对应SQL的between
SimpleExpression Restrictions.like 对应SQL的like
Criterion Restrictions.in 对应SQL的in
LogicalExpression Restrictions.and and关系
LogicalExpression Restrictions.or or关系
Criterion Restrictions.isNull 为空
Criterion Restrictions.sqlRestriction SQL限定查询
Criterion Restrictions.not 取反
2.3、Order排序
语法:
Criteria criteria = session.createCriteria(Dept.class);
criteria.addOrder(Order.asc("name"))
.addOrder(Order.desc("loc"));
//SELECT * FROM DEPT ORDER BY name ASC, loc DESC
返回值类型 方法名称 描述
Order Order.asc(String propertyName) 升序
Order Order.desc(String propertyName) 降序
2.4、分页查询
Criteria criteria = session.createCriteria(Dept.class);
int pageNum = 2, pageSize = 5;
criteria.setFirstResult((pageNum-1)*pageSize); //查询起始行下标
criteria.setMaxResults(pageSize); //查询的最大行数
List list = criteria.list();
//setFirstResult方法和setMaxResults方法同样可以在SQLQuery及Query类型上使用
3、原生SQL查询
1、查询
String sql = "select uid,uname,upwd from _users";
List list = session.createSQLQuery(sql).list();
for(Object obj : list){
System.out.println(obj);
}
2、 addEntity()
String sql = "select uid,uname,upwd from _users";
// addEntity()可以告诉Hibernate你想要封装成对象的类型,然后自动为你封装
SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);
List<User> list = query.list();
for(Users user : list){
System.out.println(user.getUname());
}
3、 uniqueResult
String sql = "select uid,uname,upwd from _users where uid = 2";
SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);
Users user = (Users) query.uniqueResult();//返回单一对象
System.out.println(user.getUname());
USB Microphone https://www.soft-voice.com/
Wooden Speakers https://www.zeshuiplatform.com/
亚马逊测评 www.yisuping.cn
深圳网站建设www.sz886.com