1. 程式人生 > 其它 >Hibernate查詢語句

Hibernate查詢語句

技術標籤:M程式設計框架hibernate

1 hql查詢

Hibernate的查詢語句,hiberante提供的面向物件的查詢語言,和sql語句的語法的相似.而且嚴格區分大小寫。

1.1 from字句

/**
 * hql: from 字句
 * ***/
@Test
public void  testFromHql()
{
    //獲得Session物件
    Session session=sf.openSession();
    String hql="from Dept";
    //獲得部門物件的集合
    List<Dept>   dlist = session.createQuery(hql).list();
    for(Dept d:dlist){
        System.out.println(d.getDname());
    }
    //釋放資源
    session.close();
}

語法:from 類名

1 from 類名

返回值就是該類對應的物件的集合

2 關聯查詢

From 類名1,…類名N 返回值為Object類的陣列的集合

Object型別陣列中元素為:類名1 ….類名N對應的物件

1.2 select字句

select:後指定一個屬性

Select:後指定兩個屬性

/**
 * hql: select 字句
 * select查詢獲得不是某個pojo類的物件集合
 * ***/
@Test
public void  testSelectHql()
{
    //獲得Session物件
    Session session=sf.openSession();
    //select:後面指定一個屬性
    /*String hql="select dname from Dept";
        //獲得指定屬性型別對應的集合
        List<String>  dlist = session.createQuery(hql).list();
        for(String d:dlist){
            System.out.println(d);
        }*/
    //select:後面指定多個屬性
    String hql="select did,dname from Dept";
    //獲得Object型別陣列的集合
    List<Object[]>  dlist = session.createQuery(hql).list();
    for(Object[] d:dlist)
    {
        System.out.println(d[0]+"\t"+d[1]);
    }
    //釋放資源
    session.close();
}

Select返回值三種情況

1 select 指定一個屬性

返回值為屬性對應的型別的集合

2 select指定n個屬性

返回值為Object[]陣列的集合,陣列中元素為指定屬性對應的值

3 select獲得結果為單行單列

直接返回Object型別的物件,uniqueResult()

1.3關聯查詢

/***
 * 關聯查詢
 * ***/
@Test
public void  testJoinHql()
{
    //獲得Session物件
    Session session=sf.openSession();
    /*String hql="from Dept d,Post p where d.did=p.dept.did";
        //獲得Object型別的陣列集合,陣列中元素是關聯的pojo類物件
        List<Object[]>  dlist = session.createQuery(hql).list();
        for(Object[] d:dlist){
            //System.out.println(d[0]+"\t"+d[1]);
            Dept dept=(Dept)d[0];
            Post post=(Post)d[1];
            System.out.println(dept.getDname()+"\t"+post.getPname());
        }*/
    String hql="select d.dname,p.pname from Dept d,Post p where d.did=p.dept.did";
    //獲得Object型別的陣列集合,陣列中元素是select後面指定的屬性
    List<Object[]>  dlist = session.createQuery(hql).list();
    for(Object[] d:dlist)
    {
        System.out.println(d[0]+"\t"+d[1]);
    }
    //釋放資源
    session.close();
}

1.4連線查詢

/***
 * 內連線:inner join
 * ***/
@Test
public void  testInnerJoinHql()
{
    //獲得Session物件
    Session session=sf.openSession();
    String hql="from Dept d inner join d.posts ";
    List<Object[]> list = session.createQuery(hql).list();
    //遍歷結果集
    for(Object[] arr:list)
    {
        System.out.println(arr[0]+"\t"+arr[1]);
    }
    //釋放資源
    session.close();
}
/***
 * 做外連線:left join
 * ***/
@Test
public void  testLeftJoinHql()
{
    //獲得Session物件
    Session session=sf.openSession();
    String hql="from Dept d left join d.posts p  ";
    List<Object[]> list = session.createQuery(hql).list();
    //遍歷結果集
    for(Object[] arr:list)
    {
        System.out.println(arr[0]+"\t"+arr[1]);
    }
    //釋放資源
    session.close();
}

不需要指定關聯的條件,
hibernate根據對映檔案自動關聯

1.5聚合和分組查詢

/***
 * 聚合和分組查詢
 * max
 * min
 * avg
 * sum
 * ***/
@Test
public void  testFunGroup()
{
    //獲得Session物件
    Session session=sf.openSession();
    /***獲得每個部門下的崗位人數***/
    String hql="select p.dept.dname ,count(pid) from  Post p group by p.dept.did  ";
    List<Object[]> list = session.createQuery(hql).list();
    //遍歷結果集
    for(Object[] arr:list)
    {
        System.out.println(arr[0]+"\t"+arr[1]);
    }
    //釋放資源
    session.close();
}

1.6 where 字句

和屬性的表示式寫法一樣

And or not

< >= <=

In , not in

Like,not like

Between and

1.7 order by字句

2 條件查詢

標準的面向物件的查詢,

public class TestMany2One 
{
    /**
     * 通過靜態程式碼塊載入配置檔案
     * ****/
    static SessionFactory sf=null;
    static
    {
        //1 建立Configuration物件,用來載入hibernate的配置檔案
        Configuration  cfg = new Configuration();
        //2載入配置檔案
        cfg.configure("hibernate.cfg.xml");
        //3通過cfg構造一個會話工廠物件
        sf=cfg.buildSessionFactory();
    }
    /**
     * criteria:查詢所有(所有列,所有行)
     * ***/
    @Test
    public void  testCriteria()
    {
        //獲得Session物件
        Session session=sf.openSession();
        List<Dept> list=session.createCriteria(Dept.class, "d").list();
        for(Dept d:list){
            System.out.println(d.getDname());
        }
        //釋放資源
        session.close();
    }
    /**
     * criteria:查詢所有(所有列,所有行)
     * 進行結果的過濾
     * ***/
    @Test
    public void  testCriteria2()
    {
        //獲得Session物件
        Session session=sf.openSession();
        Criteria c = session.createCriteria(Dept.class, "d");
        //加where過濾條件
        //c.add(Restrictions.eq("d.did", 11));
        //c.add(Restrictions.like("d.dname", "安慰%"));
        //c.add(Restrictions.)
        List<Dept> list = c.list();
        for(Dept d:list)
        {
            System.out.println(d.getDname());
        }
        //釋放資源
        session.close();
    }
    /**
     * criteria:查詢所有(所有列,所有行)
     * 進行結果的過濾
     * 查詢指定的列:進行投影查詢Projections
     * ***/
    @Test
    public void  testCriteria3()
    {
        //獲得Session物件
        Session session=sf.openSession();
        Criteria c = session.createCriteria(Dept.class, "d");
        //查詢指定的列
        c.setProjection(Projections.projectionList().add(Projections.property("dname"))
                .add(Projections.property("did")));
        List<Object[]> list = c.list();
        for(Object[] d:list)
        {
            System.out.println(d[0]+"\t"+d[1]);
        }
        //釋放資源
        session.close();
    }
    /**
     * criteria:查詢所有(所有列,所有行)
     * 進行結果的過濾
     * 查詢指定的列:進行投影查詢Projections
     * 投影,聚合 ,分組
     *
     * ***/
    @Test
    public void  testCriteria4()
    {
        //獲得Session物件
        Session session=sf.openSession();
        Criteria c = session.createCriteria(Dept.class, "d");
        //查詢指定的列
        c.setProjection(Projections.projectionList().add(Projections.property("d.dname"))
                .add(Projections.property("d.did"))
                .add(Projections.count("d.did"))
                .add(Projections.groupProperty("d.dname")));
        List<Object[]> list = c.list();
        for(Object[] d:list)
        {
            System.out.println(d[0]+"\t"+d[1]+"\t"+d[2]);
        }
        //釋放資源
        session.close();
    }
    /***
     * 關聯查詢
     *
     * ****/
    @Test
    public void  testCriteria5()
    {
        //獲得Session物件
        Session session=sf.openSession();
        Criteria c = session.createCriteria(Dept.class, "d");
        //關聯崗位
        c.createAlias("d.posts", "p");
        //查詢指定的列
        //c.add(Restrictions.eqProperty("d.did", "p.dept.did"));
        List<Dept> list = c.list();
        for(Dept d:list)
        {
            System.out.print(d.getDname()+"\t");
            Set<Post> posts=d.getPosts();
            for(Post p:posts)
            {
                System.out.print(p.getPname()+"\t\t");
            }
            System.out.println();
        }
        //釋放資源
        session.close();
    }
}

3 Hql語句的引數封裝

/**
 * Hql:的引數
 * ***/
@Test
public void  testHqlParam()
{
    //獲得Session物件
    Session session=sf.openSession();
    //定義hql語句,hql語句中包含佔位符
    String hql="from Dept d where d.dname=? ";
    session.createQuery(hql).setString(0, "研發部");
    //常用的
    String hql2="from Dept d where d.dname=:dname";
    List<Dept> list=session.createQuery(hql2).setString("dname", "研發部").list();
    for(Dept d:list)
    {
        System.out.println(d.getDid()+"\t"+d.getDname());
    }
    //釋放資源
    session.close();
}

1 from 類名

返回值就是該類對應的物件的集合

2 關聯查詢

From 類名1,…類名N

返回值為Object類的陣列的集合

Object型別陣列中元素為:類名1

….類名N對應的物件

Select返回值三種情況

1 select 指定一個屬性

返回值為屬性對應的型別的集合

2 select指定n個屬性

返回值為Object[]陣列的集合,陣列中元素為指定屬性對應的值

3 select獲得結果為單行單列

直接返回Object型別的物件,uniqueResult()

不需要指定關聯的條件,
hibernate根據對映檔案自動關聯