這篇主要簡單間接 hibernate查詢
1.數據庫操作中最重要的是查詢,Hibernate提供了多種查詢方式來幫助程序員快速實現查詢功能。
有hql,本地sql查詢,Criteria查詢,example, oid等。
2.Hql 查詢:
Hql :hibernate query language,Hiberante查詢語言。這是一種面向對象的查詢語言,和 sql 語句非常相似,對於查詢關鍵字不區分大小寫,其他的都區分大小寫。
3.測試
public class HibernateTest { Session session =null; //在每次執行測試方法前,先執行一次 @Before public void before(){ session = HibernateUtil.getSession(); } //每次執行測試方法后,執行一次 @After public void after(){ HibernateUtil.close(); } //查詢所有 @Test public void testFindAll(){ //編寫hql語句 Book是類名 區分大小寫,相當於select * from t_book; String hql="from Book"; List<Book> list = session.createQuery(hql).list(); for(Book b:list){ System.out.println(b.getName()+"----"+b.getAuthor()); } } //條件查詢 @Test public void testCondition(){ //可以在類名 后設置別名,如果設置了別名就得使用 String hql="from Book b where b.price>40"; List<Book> list = session.createQuery(hql).list(); for(Book b:list){ System.out.println(b.getName()+"----"+b.getAuthor()); } } //傳參 @Test public void testParam(){ //可以在類名 后設置別名,如果設置了別名就得使用 String hql="from Book b where b.price>?"; List<Book> list = session.createQuery(hql) .setDouble(0, 40)//為占位符設置參數 .list(); for(Book b:list){ System.out.println(b.getName()+"----"+b.getAuthor()); } } //參數通過命名查詢 @Test public void testNameParam(){ //命名前 加冒號 String hql="from Book b where b.price>:price"; List<Book> list = session.createQuery(hql) .setDouble("price", 40)//為占位符設置參數 .list(); for(Book b:list){ System.out.println(b.getName()+"----"+b.getAuthor()); } } //模糊查詢 @Test public void testLike(){ String hql="from Book b where b.name like :name"; List<Book> list = session.createQuery(hql) .setString("name", "水%")//為占位符設置參數 .list(); for(Book b:list){ System.out.println(b.getName()+"----"+b.getAuthor()); } } //查詢指定列的數據 @Test public void testColumn(){ String hql="select b.name,b.author from Book b"; List<Object[]> list = session.createQuery(hql).list(); for(Object[] temp:list){ System.out.println(temp[0]+"---"+temp[1]); } } //將查詢指定列的數據封裝為對象 @Test public void testColumnObject(){ String hql="select new Book(b.name,b.author) from Book b"; List<Book> list = session.createQuery(hql).list(); for(Book b:list){ System.out.println(b.getName()+"---"+b.getAuthor()); } } //聚合函數查詢 @Test public void testCount(){ String hql="select count(id) from Book"; List list=session.createQuery(hql).list(); System.out.println(list.get(0)); } //返回唯一值 uniqueResult返回值 只有一個值 @Test public void testCount1(){ String hql="select count(id) from Book"; long result=(Long)session.createQuery(hql).uniqueResult(); System.out.println(result); } //查詢單個對象也可以使用uniqueResult @Test public void testUniqueObject(){ String hql="from Book b where b.id=1"; Book b = (Book)session.createQuery(hql).uniqueResult(); System.out.println(b.getName()+"---"+b.getAuthor()); } //分頁查詢 @Test public void testPage(){ //當前頁 currentPage //每頁顯示記錄數 pageSize List<Book> list = session.createQuery("from Book") //(currentPage-1)*pageSize .setFirstResult(3) //pageSize .setMaxResults(3) .list(); for(Book b:list){ System.out.println(b.getName()+"---"+b.getAuthor()); } } //in子查詢 @Test public void testIn(){ String hql="from Book b where b.id in(:ids)"; List<Book> list = session.createQuery(hql) .setParameterList("ids", new Integer[]{1,2,4}) .list(); for(Book b:list){ System.out.println(b.getId()+"---"+b.getName()+"---"+b.getAuthor()); } } //排序 @Test public void testOrder(){ String hql="from Book b where b.id in(:ids) order by b.id desc"; List<Book> list = session.createQuery(hql) .setParameterList("ids", new Integer[]{1,2,4}) .list(); for(Book b:list){ System.out.println(b.getId()+"---"+b.getName()+"---"+b.getAuthor()); } } //分組查詢 按書籍分類查詢每個組的書的數量 //查詢列 必須是分組列或聚合列 @Test public void testGroup(){ String hql="select count(*),b.category.name from Book b group by b.category.name"; List<Object[]> list = session.createQuery(hql).list(); for(Object[] temp:list){ System.out.println(temp[0]+"----"+temp[1]); } } //連接查詢 @Test public void testInner(){ //String hql="select b.name,b.category.name,b.author from Book b"; String hql="select b.name,b.category.name,b.author from Book b inner join b.category"; List<Object[]> list = session.createQuery(hql).list(); for(Object[] temp:list){ System.out.println(temp[0]+"----"+temp[1]+"----"+temp[2]); } } //命名查詢 /** *在映射文件中配置好 如下命名查詢 <!-- hql命名查詢 名稱在整個項目唯一 --> <query name="findAll"> from Book; </query> */ @Test public void testNamedQuery(){ List<Book> list = session.getNamedQuery("findAll").list(); for(Book b:list){ System.out.println(b.getName()+"--"+b.getAuthor()); } } }
4.本地 sql 查詢: hibernate支持使用 sql 來查詢;因為 hql 語句不能針對特定數據庫功能來實現。
public class SqlTest { Session session =null; //在每次執行測試方法前,先執行一次 @Before public void before(){ session = HibernateUtil.getSession(); } //每次執行測試方法后,執行一次 @After public void after(){ HibernateUtil.close(); } //查詢所有 @Test public void testFindAll(){ String sql="select * from t_book"; List<Object[]> list =session.createSQLQuery(sql).list(); for(Object[] temp:list){ System.out.println(temp[0]+"---"+temp[1]+"---"+temp[2]); } } //將查詢的數據進行封裝為對象 @Test public void testObject(){ String sql="select * from t_book"; List<Book> list = session.createSQLQuery(sql).addEntity(Book.class).list(); for(Book b:list){ System.out.println(b.getName()+"----"+b.getAuthor()); } } //本地命名查詢 @Test public void testNamedQuery(){ Object[] temp= (Object[])session.getNamedQuery("findBookById").uniqueResult(); System.out.println(temp[0]+"---"+temp[1]); } //設置參數 @Test public void testParam(){ String sql="select * from t_book where price>?"; List<Book> list = session.createSQLQuery(sql).addEntity(Book.class) .setDouble(0, 40) .list(); for(Book b:list){ System.out.println(b.getName()+"----"+b.getAuthor()); } } //設置參數名稱 @Test public void testParamName(){ String sql="select * from t_book where price>:price"; List<Book> list = session.createSQLQuery(sql).addEntity(Book.class) .setDouble("price", 40) .list(); for(Book b:list){ System.out.println(b.getName()+"----"+b.getAuthor()); } } //分頁 @Test public void testPage(){ String sql="select * from t_book"; List<Book> list = session.createSQLQuery(sql).addEntity(Book.class) .setFirstResult(0) .setMaxResults(2) .list(); for(Book b:list){ System.out.println(b.getName()+"----"+b.getAuthor()); } } }
5. Criteria 查詢:使用對象的方式進行查詢
public class CriteriaTest { Session session =null; //在每次執行測試方法前,先執行一次 @Before public void before(){ session = HibernateUtil.getSession(); } //每次執行測試方法后,執行一次 @After public void after(){ HibernateUtil.close(); } //查詢所有 @Test public void testFindAll(){ List<Book> list =session.createCriteria(Book.class).list(); printListbook(list); } private void printListbook(List<Book> list) { for(Book b:list){ System.out.println(b.getName()+"---"+b.getAuthor()); } } //條件查詢 使用Restrictions類的靜態方法 添加各種條件 @Test public void testCondition(){ List<Book> list =session.createCriteria(Book.class) //通過add添加條件 .add(Restrictions.ge("price", 40d)) .list(); printListbook(list); } //多個條件and查詢 價格大於20 並且 作者是sun @Test public void testMultiConditionAnd(){ List<Book> list =session.createCriteria(Book.class) //通過add添加條件 .add(Restrictions.ge("price", 20d)) .add(Restrictions.eq("author", "sun")) .list(); printListbook(list); } @Test public void testMultiConditionAnd1(){ List<Book> list =session.createCriteria(Book.class) //通過add添加條件 .add(Restrictions.and(Restrictions.ge("price", 20d), Restrictions.eq("author", "sun"))) .list(); printListbook(list); } //多條件or查詢 價格大於20 或者 作者是sun @Test public void testMultiConditionOr(){ List<Book> list =session.createCriteria(Book.class) //通過add添加條件 .add(Restrictions.or(Restrictions.ge("price", 20d), Restrictions.eq("author", "sun"))) .list(); printListbook(list); } //or 和 and 查詢 查詢價格大於20 作者是sun 或者價格大於40的書籍信息 @Test public void testAndOr(){ List<Book> list =session.createCriteria(Book.class) //通過add添加條件 .add(Restrictions.or(Restrictions.ge("price", 40d), Restrictions.and(Restrictions.eq("author", "sun"), Restrictions.ge("price", 20d)))) .list(); printListbook(list); } //排序 @Test public void testOrder(){ List<Book> list = session.createCriteria(Book.class) .addOrder(Order.asc("price")) .list(); printListbook(list); } //分頁 @Test public void testPage(){ List<Book> list = session.createCriteria(Book.class) .setFirstResult(0) .setMaxResults(2) .list(); printListbook(list); } //聚合查詢 使用Projections來完成 @Test public void testCount(){ Long result = (Long)session.createCriteria(Book.class) .setProjection(Projections.countDistinct("id")) .uniqueResult(); System.out.println(result); } }
6.過濾查詢
a).定義過濾器---在hibernate-mapping中定義
<!-- 過濾器定義 --> <filter-def name="idFilter"> <filter-param name="idParam" type="int"/> </filter-def>
b). 引用過濾器---在class標簽中引用
<class name="Book" table="t_book"> <id name="id"> <generator class="native"></generator> </id> <property name="name"/> <property name="author"/> <property name="price"/> <property name="pubDate"/> <!-- 多對一的關聯關系設置 column指定外鍵的名稱 --> <many-to-one name="category" column="cid" fetch="join"/> <filter name="idFilter" condition=":idParam=id"></filter> </class>
c). 查詢時使用
@Test public void testFilter(){ session.enableFilter("idFilter")//啟動過濾器 .setParameter("idParam", 1);//設置過濾參數 Book b=(Book)session.createQuery("from Book").uniqueResult(); System.out.println(b.getName()+"---"+b.getAuthor()); }