摘要:此時,我們不能在層使用因為它是和綁定的??梢越鉀Q這個問題,即在層,程序員使用來構造查詢條件,然后將這個作為方法調用參數傳遞給業務層對象。而業務層對象獲得之后,可以在范圍內直接構造,進行查詢。參考問題十二投影聚合和分組是的實例工廠。
問題九、Hibernate里面如何用Criteria 查詢記錄數
【問題描述】在工作中,有一個比較復雜的feature使用的是hibernate的Criteria實現的查詢,但是PM要求在查詢數據前,先告知用戶有多少條數據,讓用戶去選擇返回多少條記錄。
【解決辦法】使用Projections.count("property") 或者 Projections.rowCount()
Criteria c = session.createCriteria(User.class); c.setProjection(Projections.rowCount()); int rows=Integer.parseInt(c.uniqueResult().toString()); s.setProjection(null)
參考:http://blog.csdn.net/virgoboy...
問題十、Hibernate Criteria Join with 3 TablesCriteria c = session.createCriteria(Dokument.class, "dokument"); c.createAlias("dokument.role", "role"); // inner join by default c.createAlias("role.contact", "contact"); c.add(Restrictions.eq("contact.lastName", "Test")); return c.list();
或者這樣:
Criteria c = session.createCriteria(Dokument.class); c.createAlias("role", "role"); // inner join by default c.createAlias("role.contact", "contact"); c.add(Restrictions.eq("contact.lastName", "Test")); return c.list();
如果實體對象中含有OneToMany關聯對象的情況,既是實體中含有list或Set等關聯實體集合的情況下怎么辦呢?
這個還不知道怎么辦,呵呵
方法其實是非常簡單的:
dc.createAlias("tags", "t"); dc.add(Restrictions.eq("t.id", tagId));
其中tags是個Set,但是想查找屬性tags中含有id為tagId的實體,使用上面的就可以了。
這里有一個特殊情況,如果是對引用對象的id查詢,則可以不用建立引用,也就是可以不調用createAlias()語句,如下所示:
DetachedCriteria dc = DetachedCriteria.forClass(Student.class); dc.add(Restrictions.like("team.id", teamId, MatchMode.ANYWHERE));
據我個人的經驗,team后只能跟其主鍵屬性,比較其他屬性要用別名。
參考:http://stackoverflow.com/ques...
http://www.cnblogs.com/newpan...
在常規的Web編程中,有大量的動態條件查詢,即用戶在網頁上面自由選擇某些條件,程序根據用戶的選擇條件,動態生成SQL語句,進行查詢。
此時,我們不能在Web層使用Criteria,因為它是和Session綁定的。
DetachedCriteria可以解決這個問題,即在web層,程序員使用DetachedCriteria來構造查詢條件,然后將這個 DetachedCriteria作為方法調用參數傳遞給業務層對象。而業務層對象獲得DetachedCriteria之后,可以在session范圍內直接構造Criteria,進行查詢。就此,查詢語句的構造完全被搬離到web層實現,而業務層則只負責完成持久化和查詢的封裝即可,與查詢條件構造完全解耦,非常完美!
Criteria 和 DetachedCriteria 的主要區別
在于創建的形式不一樣, Criteria 是在線的,所以它是由 Hibernate Session 進行創建的,而 DetachedCriteria 是離線的,創建時無需Session .
DetachedCriteria的創建
DetachedCriteria 提供了 2 個靜態方法 ,進行DetachedCriteria 實例的創建。
forClass(Class)
forEntityName(Name)
Spring 的框架提供了對于離線查詢的支持,非常的簡單的使用那些方法
Spring 的框架提供了getHibernateTemplate().findByCriteria(detachedCriteria) 方法可以很方便地根據DetachedCriteria 來返回查詢結果。Criteria的子類就是 DetachedCriteria 我們可以簡單的使用就好了。
使用到了這些我們就不得不說 Restrictions 是產生查詢條件的工具類。
當然你也可以手動這么干:
DetachedCriteria query = DetachedCriteria.forClass(Cat.class) .add( Property.forName("sex").eq("F") ); //創建一個Session Session session = .; Transaction txn = session.beginTransaction(); List results = query.getExecutableCriteria(session).setMaxResults(100).list(); txn.commit(); session.close();
切記,DetachedCriteria實例不要去重用它。
DetachedCriteria作為子查詢//主查詢:人員查詢 DetachedCriteria searDc = DetachedCriteria.forClass(QymlPerson.class); //子查詢:職務人員關系表 DetachedCriteria sub = DetachedCriteria.forClass(QymlPositionUserLink.class); sub.add(Restrictions.eq("positionunid", positionunid)); //子查詢:指定查詢的列(也就是select usernuid from ....) sub.setProjection(Property.forName("userunid")); //主查詢和子查詢關聯(也就是where unid in (select userunid from...) ) searDc.add(Property.forName("unid").in(sub));
在上面的例子中,用個一個類似于下面SQL 的子查詢
Select * from Person a where a.unid in (select userunid from PositionUserLink b where b.positionunid = ..)
Property 還有其他的條件判斷,參考api
http://docs.jboss.org/hiberna...
ion/Property.html。
我們的抓取模式,對于1對多的關聯的形式!是不是抓取過來呢?
你可以使用setFetchMode()在運行時定義動態關聯抓取的語義
List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .setFetchMode("mate", FetchMode.JOIN) .setFetchMode("kittens", FetchMode.JOIN) .list();
這個查詢可以通過外連接抓取mate和kittens。
參考:http://blog.csdn.net/u0128819...
http://blog.sina.com.cn/s/blo...
org.hibernate.criterion.Projections是 Projection 的實例工廠。
我們通過調用setProjection()應用投影到一個查詢。這個的意思就是查詢哪一列的意思
用來進行聚合操作,和sql中的聚合類似.求和/求平均值/統計記錄數/…等等.
還有用來獲取獲取對象的某些屬性(表字段)或屬性集合.正常情況下,查詢返回的是對象或對象的集合.使用投影的話就可以只返回你需要的屬性值.此時,即Hibernate不把記錄封裝對象了,只返回你在投影中設置的屬性的值(值的集合)的數組
List results = session.createCriteria(Cat.class) .setProjection( Projections.projectionList() .add( Projections.rowCount() ) //當你添加一個投影到一個投影列表中時 你可以為它指定一個別名:如 //.add( Projections.rowCount() ,"count") .add( Projections.avg("weight") ) .add( Projections.max("weight") ) .add( Projections.groupProperty("color") ) ) .list();
可以選擇把一個別名指派給一個投影,這樣可以使投影值被約束或排序所引用。下面是兩種不同的實現方式:
List results = session.createCriteria(Cat.class) .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) ) //.setProjection( Projections.groupProperty("color").as("colr") ) .addOrder( Order.asc("colr") ) .list();
也可以使用Property.forName()來表示投影:
List results = session.createCriteria(Cat.class) .setProjection( Projections.projectionList() .add( Projections.rowCount().as("catCountByColor") ) .add( Property.forName("name")) .add( Property.forName("weight").avg().as("avgWeight") ) .add( Property.forName("weight").max().as("maxWeight") ) .add( Property.forName("color").group().as("color" ) ) .addOrder( Order.desc("catCountByColor") ) .addOrder( Order.desc("avgWeight") ) .list();
參考:http://blog.csdn.net/u0128819...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69906.html
摘要:阿里數據庫連接池數據庫基本信息配置最大并發連接數初始化連接數量配置獲取連接等待超時的時間最小空閑連接數配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位 1、web.xml openSessionInViewFilter org.springframework.orm.hibernate4.support.OpenSessionInView...
摘要:的離線查詢對象用起來的確很是方便,但是其有一個缺陷通過條件表達式方法添加的條件會累加其實就是存入中的這樣如果要執行不同的查詢需要不同的查詢條件時就需要分別創建不同的離線查詢對象。 hibernate的離線查詢對象DetachedCriteria用起來的確很是方便,但是其有一個缺陷:通過·add(條件表達式)方法添加的條件, 會累加, 其實就是存入list中的, 這樣如果要執行不同的查...
一:字典表 字典信息:在項目中可能會使用到,已經存在的一些信息。 例如,客戶的級別:普通用戶,vip用戶... 客戶的來源:網絡營銷,電話營銷... 客戶所屬行業:電子商務,房地產... 客戶的性別:男,女 在保存用戶的時候,這些信息都是已經存在的,不應該讓用戶讓用戶來任意填寫, 而是通過下拉列表來讓用戶選擇。 這些已經存在的信息稱之為字典信...
一:字典表 字典信息:在項目中可能會使用到,已經存在的一些信息。 例如,客戶的級別:普通用戶,vip用戶... 客戶的來源:網絡營銷,電話營銷... 客戶所屬行業:電子商務,房地產... 客戶的性別:男,女 在保存用戶的時候,這些信息都是已經存在的,不應該讓用戶讓用戶來任意填寫, 而是通過下拉列表來讓用戶選擇。 這些已經存在的信息稱之為字典信...
閱讀 1858·2021-09-22 15:45
閱讀 1640·2019-08-30 15:55
閱讀 1829·2019-08-29 11:16
閱讀 3302·2019-08-26 11:44
閱讀 702·2019-08-23 17:58
閱讀 2698·2019-08-23 12:25
閱讀 1624·2019-08-22 17:15
閱讀 3597·2019-08-22 16:09