項目中用到了criteria的查詢方式,覺得挺好用的,下班后找了一下資料,一邊測試,一邊在博客上面記錄下來
如何使用
查所有
/** * 作用:查所有 * 說明:通過list(),返回的是實體對象集合 */ @Test public void test1(){ //創建連接 Session session = HibernateUtil.getCurrentSession(); //開啟事務 Transaction tx = session.beginTransaction(); //創建criteria Criteria criteria = session.createCriteria(User.class, "u"); //業務 List<User> list = criteria.list(); for (User user : list) { System.out.println(user); } //關閉事務 session.close(); }
條件查詢
1)一個條件
/** * 作用:or()用法 * 說明:通過or()返回的是實體對象集合 * add(Criterion criterion)用來添加查詢條件 * Restrictions通過內置的靜態方法,可以創建criterion */ //創建criteria Criteria criteria = session.createCriteria(User.class, "u"); //業務:查詢出id為1或為2的用戶 List<User> list = criteria.add(Restrictions.or(Restrictions.eq("id", 1), Restrictions.eq("id", 2) )) .list();
2)多個條件
/** * 作用:多個條件:like()和gt()的用法 */ //創建criteria Criteria criteria = session.createCriteria(User.class, "u"); //業務:查詢出id大於1,名字中帶ji的用戶 List<User> list = criteria.add(Restrictions.like("name","%ji%")) .add(Restrictions.gt("id", 1)) .list();
其他的條件就不一一測試了,下面列出常用的Restrictions方法
Restrictions.eq 等於 Restrictions.allEq 使用Map,使用key/value進行多個等於的比對 Restrictions.gt 大於 > Restrictions.ge 大於等於 >= Restrictions.lt 小於 < Restrictions.le 小於等於 <= Restrictions.between 對應SQL的BETWEEN子句 Restrictions.like 對應SQL的LIKE子句 Restrictions.in 對應SQL的in子句 Restrictions.and and關系 Restrictions.or or關系
排序
/** * 作用:排序 * 說明:通過addOrder()添加排序條件 * Order設置排序規則,desc是降序,asc是升序 */ //創建criteria Criteria criteria = session.createCriteria(User.class, "u"); //業務:對查詢結果,根據id排序 List<User> list = criteria.addOrder(Order.desc("id")) .list();
關聯
參考 : http://blog.csdn.net/bestlxm/article/details/6735464
User實體類中有關系屬性orders,
數據庫中的數據如下:order表中的外鍵是user_id
user表:

order表:

代碼如下:
/** * 作用:關聯 * 說明:通過createAlias()設置關系屬性 * 對已定義關聯關系的,我們可以使用createAlias()來創建屬性的別名,然后引用別名進行條件查詢,如: 這樣進行查詢時就可得到關聯查詢后的Parent對象結果集,本例中,User是Parent類 * * Hibernate打印sql語句如下: * select this_.id as id0_1_, this_.age as age0_1_, this_.birth as birth0_1_, this_.name as name0_1_, o1_.id as id1_0_, o1_.note as note1_0_, o1_.price as price1_0_ from user50 this_ inner join order50 o1_ on this_.id=o1_.user_id where o1_.id = ? * 控制台打印如下: * User [userID=1, name=zhangjifeng, age=18, birthday=2016-07-26] */ @Test public void test5(){ //創建連接 Session session = HibernateUtil.getCurrentSession(); //開啟事務 Transaction tx = session.beginTransaction(); //創建criteria Criteria criteria = session.createCriteria(User.class, "u"); //業務: List<User> list = criteria.createAlias("orders","o") .add(Restrictions.eq("o.id", 1)) .list(); for (User user : list) { System.out.println(user); } //關閉事務 session.close(); }
關聯2:createCriteria()
測試代碼如下
/** * 第二個createCriteria(),返回的是一個新的實例 * 打印出user和order */ @Test public void test6(){ //創建連接 Session session = HibernateUtil.getCurrentSession(); //開啟事務 Transaction tx = session.beginTransaction(); //創建criteria Criteria criteria = session.createCriteria(User.class, "u"); //業務: List list = criteria.createCriteria("orders","o") .add(Restrictions.eq("o.id", 1)) .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP) .list(); Iterator iterator = list.iterator(); while (iterator.hasNext()) { Map map = (Map)iterator.next(); // Set keySet = map.keySet(); Set entrySet = map.entrySet(); Iterator iterator2 = entrySet.iterator(); while(iterator2.hasNext()){ Map.Entry<String, Object> map1 =(Entry<String, Object>) iterator2.next(); System.out.println(map1.getValue()); } } //關閉事務 session.close(); }
Projections投影
1)將結果集中的結果當做行和列集來使用,這與通過JDBC執行select查詢獲得的數據的使用方式相似。因此,Hibernate也支持屬性、統計函數和Group By等查詢。
2)要想使用Hibernate的投影統計功能,首先要從org.hibernate.criterion.Projections工廠類獲得org.hibernate.criterion.Projection對象
3)Hibernate的Projections工廠類包含了以下幾個常用的統計函數:
① avg(String propertyName):計算屬性字段的平均值。
② count(String propertyName):統計一個屬性在結果中出現的次數。
③ countDistinct(String propertyName):統計屬性包含的不重復值的數量。
④ max(String propertyName):計算屬性值的最大值。
⑤ min(String propertyName):計算屬性值的最小值。
⑥ sum(String propertyName):計算屬性值的總和。
代碼如下:
/** * 投影:Projections * 統計,重復 */ @Test public void test8(){ //創建連接 Session session = HibernateUtil.getCurrentSession(); //開啟事務 Transaction tx = session.beginTransaction(); //創建criteria Criteria criteria = session.createCriteria(Order.class, "o"); //業務: List<Object[]> list = criteria.setProjection(Projections.projectionList() .add(Projections.max("price")) .add(Projections.min("price")) .add(Projections.avg("price")) .add(Projections.countDistinct("note")) ) .list(); for (Object[] objects : list) { for (Object object : objects) { System.out.println(object); } } //關閉事務 session.close();
獲得的結果是單獨的屬性而不是實體類。例如,一個產品表中包含有很多字段,我們想要獲取產品表中的名稱和描述,而不需要將完整的實體加載到內存中
/** * 投影:Projections * 獲取部分字段 */ @Test public void test9(){ //創建連接 Session session = HibernateUtil.getCurrentSession(); //開啟事務 Transaction tx = session.beginTransaction(); //創建criteria Criteria criteria = session.createCriteria(Order.class, "o"); //業務: ProjectionList projList = Projections.projectionList(); projList.add(Projections.property("name")); projList.add(Projections.property("price")); criteria.setProjection(projList); List result = criteria.list(); for (Object object : result) { System.out.println(object); } //關閉事務 session.close(); }
