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()メソッドを呼び出してクエリー結果リストを返す
簡単な例:
HQLクエリのfrom句:
fromは最も簡単なHQL文であり、最も基本的なHQL文でもあり、fromキーワードの後には永続化クラスのクラス名が続く.
テーブル名Employeeクラスからすべてのインスタンスを選択
しかし、私たちはよくこのようにします.
このeはEmployeeの別名、つまりインスタンス名で、このように書くことをお勧めします.
HQLクエリのselect句:
select句は、指定した属性を選択するか、エンティティを直接選択するために使用されます.もちろん、selectが選択した属性はfrom後永続化クラスに含まれる属性でなければなりません.たとえば、次のようにします.
selectでは、永続化クラスの直接属性だけでなく、コンポーネント属性に含まれる属性も選択できます.たとえば、次のようにします.
HQLクエリの集計関数:
集計関数:
AVg:属性の平均値を計算する
count:選択オブジェクトの統計
max:統計属性値の最大値
min:統計属性値の最小値
sum:属性値の合計を計算する
次のようになります.
マルチステートクエリ:
HQLは、永続化クラスのすべてのインスタンスだけでなく、継承マッピングが存在することを前提として、クラスのサブクラスのすべてのインスタンスもクエリーします.
HQLクエリのwhere句:
where句は主に選択した結果をフィルタリングし、選択範囲を縮小するために使用されます.たとえば、次のようにします.
order by句:
クエリーは、クラスまたはコンポーネントのプロパティの任意のプロパティに基づいてソートできます.また、ascキーまたはdescキーを使用して昇順または降順を指定できます.たとえば、次のようにします.
サブクエリ:
サブクエリには、次のようなクエリ文とクエリ文があります.
名前付きクエリー:
HQLクエリはまた、コードではなく、クエリに使用されるHQL文を構成ファイルに挿入することをサポートします.Hibernateマッピングファイルの要素でサブ要素を使用して名前付きクエリを定義します.この要素は、名前付きクエリの名前を指定するだけで、名前付きクエリの名前を指定します.
Sessionでは、Queryオブジェクトを作成するgetNamedQuery(String name)メソッドが提供されています.Queryオブジェクトを取得すると、残りの作業は前と同じになります.
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);
}