當前位置:首頁 » 編程語言 » hibernatesql分頁查詢
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

hibernatesql分頁查詢

發布時間: 2023-05-11 11:18:41

㈠ 如何解決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