名前付きクエリとは何ですか?
Hibernate では、マッピング ファイルに文字列の形式でクエリ ステートメントを定義できます。このクエリ メソッドは名前付きクエリと呼ばれます。
名前付きクエリを使用する利点は何ですか?
Hibernate の HQL を使用すると、Java コードで文字列のクエリ ステートメントを記述する必要が生じることが多いため、コード間で HQL が混在し、コードの可読性が損なわれます。名前付きクエリを使用することで、ビジネス ロジックとクエリ ステートメントを分離でき、クエリに集中できるようになります。 SQL または HQL コードはアプリケーション全体に散在しています。
名前付きクエリを使用して複雑なクエリを処理できる
名前付きクエリを実装するにはどうすればよいですか?
以下の方法を紹介します。
方法 1:構成ファイルの <class/> タグの下でクエリ ステートメントを宣言する
次のようにコードをコピーします。
<休止状態マッピング>
<クラス名="com.test.bean.Student" テーブル="学生" カタログ="ユーザー">
<id name="id" type="integer">
<列名="id" />
<ジェネレータ />
</id>
<プロパティ名="名前" タイプ="文字列">
<列名="名前" 長さ="11" />
</プロパティ>
<プロパティ名="年齢" タイプ="整数">
<列名="年齢" />
</プロパティ>
<property name="性別" type="string">
<列名="性別" 長さ="2" />
</プロパティ>
</クラス>
<!-- クエリ ステートメントの定義 -->
<クエリ名="findStudentByName">
<![CDATA[from Student where name = :name]]>
</クエリ>
</hibernate-mapping>
注: <![CDATA[ ]]> とはどういう意味ですか?
これがないと、< > & 文字を XML に直接保存できないため、エスケープする必要があります。ただし、このタグを使用すると、これらの記号をエスケープせずに XML ドキュメントに保存できます。これにより、XML 解析エラーの原因となる予期しない特殊記号を回避できます。
次のようにコードをコピーします。
public List<Student> query(){
セッション session = HibernateSessionFactory.getSession();
クエリ q = session.getNamedQuery("findStudentByName");
q.setString("名前", "張三");
List<Student> list = q.list();
リストを返す;
}
方法 2 : 設定ファイルの <class/> タグでクエリ文を宣言することもできますが、Java コードを呼び出すときに指定する必要があります (パッケージ + クラス + 設定名)
次のようにコードをコピーします。
<休止状態マッピング>
<クラス名="com.test.bean.Student" テーブル="学生" カタログ="ユーザー">
<id name="id" type="integer">
<列名="id" />
<ジェネレータ />
</id>
<プロパティ名="名前" タイプ="文字列">
<列名="名前" 長さ="11" />
</プロパティ>
<プロパティ名="年齢" タイプ="整数">
<列名="年齢" />
</プロパティ>
<property name="性別" type="string">
<列名="性別" 長さ="2" />
</プロパティ>
<!-- クエリ ステートメントの定義 -->
<クエリ名="findStudentByName">
<![CDATA[from Student where name = :name]]>
</クエリ>
</クラス>
</hibernate-mapping>
public List<Student> query(){
セッション session = HibernateSessionFactory.getSession();
クエリ q = session.getNamedQuery("com.test.bean.Student.findStudentByName");
q.setString("名前", "張三");
List<Student> list = q.list();
リストを返す;
}
方法 3 : ネイティブ SQL クエリ <sql-query> を使用します。この方法では、テーブルのすべての列を書き込む必要があります。そうでないと、return-scalar を使用してフィールド タイプを設定しないと、「無効な列名」エラーが発生します。
次のようにコードをコピーします。
<休止状態マッピング>
<クラス名="com.test.bean.Student" テーブル="学生" カタログ="ユーザー">
<id name="id" type="integer">
<列名="id" />
<ジェネレータ />
</id>
<プロパティ名="名前" タイプ="文字列">
<列名="名前" 長さ="11" />
</プロパティ>
<プロパティ名="年齢" タイプ="整数">
<列名="年齢" />
</プロパティ>
<property name="性別" type="string">
<列名="性別" 長さ="2" />
</プロパティ>
</クラス>
<!-- クエリ ステートメントの定義 -->
<sql-query name="findStudentByName">
<return alias="s">
</戻る>
<![CDATA[s.name = :name の生徒から {s.*} を選択]]>
</sql-クエリ>
</hibernate-mapping>
注: <return/> タグ内で <return-property/> タグを使用して、テーブルのすべてのフィールドをリストすることもできます。上記の方法と同様に、すべての列がクエリされます。
次のようにコードをコピーします。
public List<Student> query(){
セッション session = HibernateSessionFactory.getSession();
クエリ q = session.getNamedQuery("findStudentByName");
q.setString("名前", "張三");
List<Student> list = q.list();
リストを返す;
}
方法 4 : ネイティブ SQL クエリ <sql-query> を使用する return-scalar を使用してフィールド タイプを設定すると、一部のフィールドをクエリできます。
次のようにコードをコピーします。
<休止状態マッピング>
<クラス名="com.test.bean.Student" テーブル="学生" カタログ="ユーザー">
<id name="id" type="integer">
<列名="id" />
<ジェネレータ />
</id>
<プロパティ名="名前" タイプ="文字列">
<列名="名前" 長さ="11" />
</プロパティ>
<プロパティ名="年齢" タイプ="整数">
<列名="年齢" />
</プロパティ>
<property name="性別" type="string">
<列名="性別" 長さ="2" />
</プロパティ>
</クラス>
<!-- クエリ ステートメントの定義 -->
<sql-query name="findStudentByName">
<return-scalar column="name" type="string"/>
<return-scalar column="age" type="integer"/>
<![CDATA[学生 s から s.name 、 s.age を選択 (s.name = :name)]]>
</sql-クエリ>
</hibernate-mapping>
public List<Object[]> query(){
セッション session = HibernateSessionFactory.getSession();
クエリ query = session.getNamedQuery("findStudentByName");
query.setString("名前", "張三");
List<Object[]> list = query.list();
リストを返す;
}
または:
次のようにコードをコピーします。
public List<Student> query(){
セッション session = HibernateSessionFactory.getSession();
クエリ q = session.getNamedQuery("findStudentByName")。
setResultTransformer(Transformers.aliasToBean(Student.class));
q.setString("名前", "張三");
List<Student> list = q.list();
リストを返す;
}