多くの場合、開発者はHQL文字列リテラルをJavaコード全体に散らばりたいと考えていますが、このメソッドは維持しにくく見苦しくなります。

幸運なことに、Hibernateは ”

names queries

“というテクニックを公開し、開発者はすべてのHQLをXMLマッピングファイルまたはアノテーションを使って入れることができます。

名前付きクエリを宣言する方法

名前付きクエリは、HQLまたはネイティブSQLの両方でサポートされています。例を見てください…​

1. XMLマッピングファイル

マッピングファイル内のHQL

<!-- stock.hbm.xml -->
<hibernate-mapping>
    <class name="com.mkyong.common.Stock" table="stock" ...>
        <id name="stockId" type="java.lang.Integer">
            <column name="STOCK__ID"/>
            <generator class="identity"/>
        </id>
        <property name="stockCode" type="string">
            <column name="STOCK__CODE" length="10" not-null="true" unique="true"/>
        </property>
        ...
    </class>

    <query name="findStockByStockCode">
        <![CDATA[from Stock s where s.stockCode = :stockCode]]>
    </query>

</hibernate-mapping>

マッピングファイル内のネイティブSQL

<!-- stock.hbm.xml -->
<hibernate-mapping>
    <class name="com.mkyong.common.Stock" table="stock" ...>
        <id name="stockId" type="java.lang.Integer">
            <column name="STOCK__ID"/>
            <generator class="identity"/>
        </id>
        <property name="stockCode" type="string">
            <column name="STOCK__CODE" length="10" not-null="true" unique="true"/>
        </property>
        ...
    </class>

    <sql-query name="findStockByStockCodeNativeSQL">
    <return alias="stock" class="com.mkyong.common.Stock"/>
    <![CDATA[select **  from stock s where s.stock__code = :stockCode]]>
    </sql-query>
</hibernate-mapping>



hibernate-mapping

‘要素の中に名前付きのクエリを置くことはできますが、 ‘

class

‘要素の前に置かないで、Hibernateは無効なマッピングファイルを要求します。素子。

2.注釈

アノテーションのHQL

@NamedQueries({
    @NamedQuery(
    name = "findStockByStockCode",
    query = "from Stock s where s.stockCode = :stockCode"
    )
})
@Entity
@Table(name = "stock", catalog = "mkyong")
public class Stock implements java.io.Serializable {
...

Native SQL in annotation

@NamedNativeQueries({
    @NamedNativeQuery(
    name = "findStockByStockCodeNativeSQL"、
    query = "ストックからsを選択**  s.stock__code =:stockCode"、
        resultClass = Stock.class
    )
})
@エンティティ
@Table(name = "stock"、catalog = "mkyong")
パブリッククラスStockはjava.io.Serializable {
...

ネイティブSQLでは、戻り値の型が何であるかをHibernateに知らせるために ‘

resultClass

‘を宣言しなければなりません。 ”

org.hibernate.cfg.NotYetImplementedException:純粋なネイティブスカラークエリはまだサポートされていません

“。

名前付きクエリを呼び出す

Hibernateでは、

getNamedQuery

メソッドを使って名前付きクエリを呼び出すことができます。

Query query = session.getNamedQuery("findStockByStockCode")
.setString("stockCode", "7277");

Query query = session.getNamedQuery("findStockByStockCodeNativeSQL")
.setString("stockCode", "7277");

結論

名前付きクエリーはグローバルアクセスです。つまり、クエリーの名前はXMLマッピングファイルまたはアノテーションで一意でなければなりません。実際の環境では、すべての名前付きクエリを独自のファイルに分離することは常に良い方法です。さらに、Hibernateマッピングファイルまたはアノテーションに格納された名前付きクエリは、Javaコードを介して分散されたクエリよりも保守が容易です。