java之hibernate之hibernate查詢


這篇主要簡單間接 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());
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM