天天看點

hibernate的各種查詢

Hibernate Query Language(HQL)

Criteria Query

Native SQL

下面對其分别進行解釋

select子句:

有時并不需要取得對象的所有屬性,這時可以使用select子句進行屬性查詢,如select s.name from Student s。

例:

void HQLselectDEMO()

hibernate的各種查詢

    {

hibernate的各種查詢

        TRegister user = new TRegister();

hibernate的各種查詢

        Session session = HibernateUtil.currentSession();

hibernate的各種查詢

        Query query = session.createQuery("select u.userName from TRegister u");

hibernate的各種查詢

        List list = query.list();

hibernate的各種查詢

        for(int i = 0 ; i < list.size(); i++)

hibernate的各種查詢

        {

hibernate的各種查詢

            String name = (String)list.get(i);

hibernate的各種查詢

            System.out.println(name);

hibernate的各種查詢

        }

hibernate的各種查詢

    }

如果要查詢兩個以上的屬性桧以數組的方式傳回,如下:

hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢

        Query query = session.createQuery("select u.userName ,u.sex from TRegister u");

hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢

            Object obj[] = (Object[])list.get(i);

hibernate的各種查詢
hibernate的各種查詢

            System.out.println(obj[0]+"    的性别是:"+obj[1]);

hibernate的各種查詢
hibernate的各種查詢

在使用屬性查詢時,由于使用對象數組,操作和了解不太友善,如果将 一個object[]中所有成員封裝成一個對象就友善多了。下面的程式做了示例:

hibernate的各種查詢

    {        

hibernate的各種查詢
hibernate的各種查詢

        Query query = session.createQuery("select new TRegister(u.userName,u.sex) from TRegister u");

hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢

            //Object obj[] = (Object[])list.get(i);

hibernate的各種查詢

            TRegister user = (TRegister)list.get(i);

hibernate的各種查詢

            System.out.println(user.getUserName()+"    的性别是:"+user.getSex());

hibernate的各種查詢
hibernate的各種查詢

        /**要正确運作以上程式,需要在TRegister類中加入一個相應的構造函數

hibernate的各種查詢

         public TRegister(String userName,String sex) {

hibernate的各種查詢

                this.userName = userName;

hibernate的各種查詢

                this.sex = sex;

hibernate的各種查詢

            }

hibernate的各種查詢

          */

hibernate的各種查詢

where子句:

HQL也支援子查詢,它通過where子句實作這一機制。where子句可以讓使用者縮小要傳回的執行個體的清單範圍。例如下面語句會傳回所有名字為"Bill"的Student執行個體:

Query query = session.createQuery("from Student as s where s.name='Bill'");

where子句允許出現的表達式包括了SQL中可以使用的大多數情況。

數學操作:+,-,*,/

真假比較操作:=, >=, <=, <>, !=, like

邏輯操作:and ,or, not

字元串連接配接:||

SQL标題函數 :如upper()和lower()

如果查詢傳回多條記錄,可以用以下關鍵字來量化

all:表示所有的記錄。

any:表示所有記錄中的任意一條。

some:與any相同。

in:與any等價。

exists:表示子查詢至少要傳回一條記錄。

例如,下面語句傳回所有學生年齡都大于18的班級對象

from Group g where 18<all  (select s.age from g.students s)

下列語句傳回在所有學生中有一個學生的年齡等于22的班級:

from Group g where 22 = any (select s.age from g.students s)

或者

from Group g where 22= some(select s.age from g.students s)

from Group g where 22 in (select s.age from g.students s)

連接配接查詢

與SQL一樣,HQL也支援連接配接查詢,如内連接配接,外連接配接和交叉連接配接:

inner join:内連接配接

left outer join:左外連接配接

rigth outer join:右外連接配接

full join:全連接配接,但不常用

下面我重點介紹下内連接配接查詢,左外連接配接和或外連接配接和内連接配接大同小異,而全連接配接幾乎沒有使用得到的地方。

inner join可以簡寫為join,例如在查詢得到的Group對象時,内連接配接取得對應的Student對象,實作的程式代碼如下:

= null;

hibernate的各種查詢

        Group group = null;

hibernate的各種查詢

        Query query = session.createQuery("from Group g join g.students");

hibernate的各種查詢
hibernate的各種查詢

        Object obj[] = null;

hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢

            obj = (Object[])list.get(i);

hibernate的各種查詢

            group = (Group)obj[0];//group是數組是第一個對象

hibernate的各種查詢

            stu = (Student)obj[1];//stu是數組的第二個對象

hibernate的各種查詢

            System.out.println(stu.getName()+"屬于"+group.getName());

hibernate的各種查詢
hibernate的各種查詢

Criteria Query方式

 當

查詢資料時,往往需要設定查詢條件。在SQL或HQL語句中,查詢條件常常放在where子句中。此處Hibernate還支援Criteria查詢,這

種查詢方式把查詢條件封裝為一個Criteria對象。在實際應用中,可以使用Session的createCriteria()方法建構一個

org.hibernate.Criteria執行個體,然後把具體的查詢條件通過Criteria的add方法加入到Criteria執行個體中。這樣程式員可

以在不使用SQL甚至HQL的情況下進行資料查詢。如下:

public void criteriaDEMO()

hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢

        Criteria criteria = session.createCriteria(TRegister.class);//生成一個Criteria執行個體

hibernate的各種查詢

        criteria.add(Restrictions.eq("userName","fengyan"));//等價于where name = 'fengyan'

hibernate的各種查詢

        List list = criteria.list();

hibernate的各種查詢

        TRegister user = (TRegister)list.get(0);

hibernate的各種查詢

        System.out.println(user.getUserName());

hibernate的各種查詢

  List list = criteria.list();

  Student stu = (Student)list.get(0);

或者:

  Criteria criertia = session.createCriteria(Student.class);

  criteria.add(Restrictions.like("name", "t",MatchMode.START));

查詢學生姓名在Bill,Jack和Tom之間所有的Student對象

 String[] names = {"Bill","Jack","Tom"};

  criteria.add(Restrictions.in("name", names));

查詢學生年齡(age)等于22或為空(null)的所有學生對象

Criteria criertia = session.createCriteria(Student.class);

  criteria.add(Restrictions.eq("age", new Integer(22)));

  criteria.add(Restrictions.isNull("age"));

查詢學生姓名以字母F開頭的所有Student對象,并按姓名升序排序

  criteria.add(Restrictions.like("name", "F%"));

  criteria.addOrder(Order.asc("name"));

注意調用Order.asc的方法應該是Criteria.addOrder()方法。

hibernate的各種查詢

Criteria criertia = session.createCriteria(Group.class);

hibernate的各種查詢

        criteria.setFetchMode("students", FetchMode.EAGER);

hibernate的各種查詢

        criteria.add(Restrictions.like("name", "2005",MatchMode.END));

hibernate的各種查詢

以上兩種方式編寫的代碼都使用相同的SQL語句來完成它們的功能,如下:

select  g.*, s.* from Group g

left outer join Student s

on g.id = s.group_id

where g.name like '%2005'

hibernate的各種查詢

String sql = "select {s.*} from t_student s where s.age>22";

hibernate的各種查詢

//{}用來引用資料表的别名,{s.*}表示使用s來做為t_student表的别名

hibernate的各種查詢

SQLQuery sqlQuery = session.createSQLQuery(sql);

hibernate的各種查詢

sqlQuery.addEntity("s",Student.class);

hibernate的各種查詢

List list = sqlQuery.list();

hibernate的各種查詢

for(int i = 0 ; i < list.size(); i++)

hibernate的各種查詢

{

hibernate的各種查詢

    Student stu = (Student)list.get(i);

hibernate的各種查詢

}

hibernate的各種查詢

//createSQLQuery(String sql)利用傳入的sql參數構造一個SQLQuery執行個體。使用該方法時,還需要傳入查詢的實體類,是以在配合使用SQLQuery的addEntity()方法一起使用。

hibernate的各種查詢
hibernate的各種查詢

  </class>

hibernate的各種查詢
hibernate的各種查詢

    <sql-query name="QueryStudents">

hibernate的各種查詢

        <![CDATA[

hibernate的各種查詢

                    select {s.*} from t_student s where s.age > 22

hibernate的各種查詢

        ]]>

hibernate的各種查詢

            <return alias="s" class="Student" />

hibernate的各種查詢

    </sql-query>

hibernate的各種查詢

</hibernate-mapping>

配合以上配置我們可以如下編寫代碼來查詢

= session.getNamedQuery("QueryStudents");

hibernate的各種查詢

List list = query.list();

hibernate的各種查詢

for(int i = 0 ; i < list.size();i++)

hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢

也可以在命名查詢是設定參數,如下:

<sql-query name="QueryStudents">

hibernate的各種查詢
hibernate的各種查詢

                    select {s.*} from t_student s where s.age > :age

hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢

程式代碼:

hibernate的各種查詢

query.setInteger("age",22);

hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢
hibernate的各種查詢

自定義insert , update和delete語句:

Hibernate 3.x的映射檔案中新添加<sql_insert>,<sql_update>,<sql-delete>3個标記。可以使用這3個标記自定義自己的insert ,update,delete語句,如:

class>

hibernate的各種查詢

    <sql-insert>

hibernate的各種查詢

        insert into t_student(name,age,id) values(?,?,?)

hibernate的各種查詢

    </sql-insert>

hibernate的各種查詢

    <sql-update>

hibernate的各種查詢

        update t_student set name=?,age=? where id=?

hibernate的各種查詢

    </sql-update>

hibernate的各種查詢

    <sql-delete>

hibernate的各種查詢

        delete from t_student where id = ?

hibernate的各種查詢

    </sql-delete>

hibernate的各種查詢

對于以上自定義的SQL語句,要注意以下幾點

1:insert 和update語句中定義的字段必須和映射檔案聲明的屬性相應,一個都不能少。

2:在insert 和update語句中,屬性出現的順序必須和映射檔案中的順序一樣。

3:在insert語句中,主鍵id總是放在最後。

在程式中實作以上自定義的insert語句如下:

= new Student();

hibernate的各種查詢

stu.setName("Bill");

hibernate的各種查詢

stu.setAge(22);

hibernate的各種查詢

session.save(stu);

如果不想在insert或update語句中包括所有屬性,則可以在屬性定義時 加上insert ="false"或update="false"如下:

property name = "name" type="string" insert = "false" update="false"/>

hibernate的各種查詢

<sql-insert>

hibernate的各種查詢

    insert into t_student(age,id) values(?,?)

hibernate的各種查詢

</sql-inert>