HQLクエリーの使用

11307 ワード

HQLはHibernate Query Languageの略で、文法的にはSQLが考えられますが、HQLはオブジェクト向けのクエリー言語です.SQLの操作オブジェクトはデータ列、テーブルなどのデータベースオブジェクトであり、HQLはクラス、インスタンス、属性である.
HQLクエリはQueryクラスに依存し、各Queryインスタンスはクエリオブジェクトに対応し、HQLクエリを使用して次の手順に従います.
1.Hibernate Sessionオブジェクトの取得
2.HQL文の作成
3.HQL文をパラメータとしてSessionのcreateQueryメソッドを呼び出してクエリー・オブジェクトを作成する
4.HQL文にパラメータが含まれている場合、QueryのsetXxxメソッドを呼び出してパラメータに値を割り当てる
5.Query固有のlist()またはuniqueResult()メソッドを呼び出してクエリー結果リストを返す
簡単な例:
@SuppressWarnings("deprecation")

public class HibernateUtil {



    private static final SessionFactory sessionFactory;

    

    static {

        sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();

    }

    

    public static Session getOpenSession() {

        return sessionFactory.openSession();

    }

    

    public static Session getCurrentSession() {

        return sessionFactory.getCurrentSession();

    }

}

 
@Entity

public class Employee {



    private Integer id;

    private String name;

    private Integer age;

    

    @Id

    @GeneratedValue

    public Integer getId() {

        return id;

    }

    

    public void setId(Integer id) {

        this.id = id;

    }

    

    @Basic

    public String getName() {

        return name;

    }

    

    public void setName(String name) {

        this.name = name;

    }

    

    @Basic

    public Integer getAge() {

        return age;

    }

    

    public void setAge(Integer age) {

        this.age = age;

    }

    

    public String toString() {

        return "id:" + id + "   " + "name:" + name +  "   " + "age:" + age;

    }

}
@SuppressWarnings("all")

public class HQLDemo {



    @Test

    public void testHQL() {

        Session session = HibernateUtil.getOpenSession();

        List<Employee> employeeList = session.createQuery("from Employee as e").list();

        for(Employee e : employeeList)

            System.out.println(e);

    }

    

    @Test

    public void testHQLHasParameter() {

        Session session = HibernateUtil.getOpenSession();

        List<Employee> employeeList = session.createQuery("from Employee as e where e.name = :personName").setString("personName", "xujianguo").list();

        for(Employee e : employeeList)

            System.out.println(e);

    }

}

 
HQLクエリのfrom句:
fromは最も簡単なHQL文であり、最も基本的なHQL文でもあり、fromキーワードの後には永続化クラスのクラス名が続く.
from Employee

テーブル名Employeeクラスからすべてのインスタンスを選択
しかし、私たちはよくこのようにします.
from employee as e

このeはEmployeeの別名、つまりインスタンス名で、このように書くことをお勧めします.
 
HQLクエリのselect句:
select句は、指定した属性を選択するか、エンティティを直接選択するために使用されます.もちろん、selectが選択した属性はfrom後永続化クラスに含まれる属性でなければなりません.たとえば、次のようにします.
select e.name from Employee as e

selectでは、永続化クラスの直接属性だけでなく、コンポーネント属性に含まれる属性も選択できます.たとえば、次のようにします.
select e.name.firstName from Employee as e

 
HQLクエリの集計関数:
集計関数:
AVg:属性の平均値を計算する
count:選択オブジェクトの統計
max:統計属性値の最大値
min:統計属性値の最小値
sum:属性値の合計を計算する
次のようになります.
select count(*) from Employee as e

 
    @Test

    public void testHQLFunction() {

        Session session = HibernateUtil.getOpenSession();

        System.out.println(session.createQuery("select count(*) from Employee as e").uniqueResult());

    }

 
マルチステートクエリ:
HQLは、永続化クラスのすべてのインスタンスだけでなく、継承マッピングが存在することを前提として、クラスのサブクラスのすべてのインスタンスもクエリーします.
 
HQLクエリのwhere句:
where句は主に選択した結果をフィルタリングし、選択範囲を縮小するために使用されます.たとえば、次のようにします.
from employee as e where e.name like "xjg%"
    @Test

    public void testHQLWhere() {

        Session session = HibernateUtil.getOpenSession();

        List<Employee> employeeList = session.createQuery("from Employee as e where e.name like 'zhou%'").list();

        for(Employee e : employeeList)

            System.out.println(e);

    }

 
order by句:
クエリーは、クラスまたはコンポーネントのプロパティの任意のプロパティに基づいてソートできます.また、ascキーまたはdescキーを使用して昇順または降順を指定できます.たとえば、次のようにします.
from Employee as e order by e.name desc

 
サブクエリ:
サブクエリには、次のようなクエリ文とクエリ文があります.
from Employee as e where e.age > (select p.age from Person as p)

 
    @Test

    public void testHQLChildQuery() {

        Session session = HibernateUtil.getOpenSession();

        List<Employee> employeeList = session.createQuery("from Employee as e where e.age > (select e1.age from Employee as e1 where e1.name = 'xujianguo')").list();

        for(Employee e : employeeList)

            System.out.println(e);

    }

 
名前付きクエリー:
HQLクエリはまた、コードではなく、クエリに使用されるHQL文を構成ファイルに挿入することをサポートします.Hibernateマッピングファイルの要素でサブ要素を使用して名前付きクエリを定義します.この要素は、名前付きクエリの名前を指定するだけで、名前付きクエリの名前を指定します.
<query name="query">

    from Employee as e

<query />

Sessionでは、Queryオブジェクトを作成するgetNamedQuery(String name)メソッドが提供されています.Queryオブジェクトを取得すると、残りの作業は前と同じになります.
    @Test

    public void testHQLNamedQuery() {

        Session session = HibernateUtil.getOpenSession();

        List<Employee> employeeList = session.getNamedQuery("query").list();

        for(Employee e : employeeList)

            System.out.println(e);

    }