Hibernateアノテーションアプリで名前付きクエリを外部化するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/602397

  •  03-07-2019
  •  | 
  •  

質問

HQL名前付きクエリを外部ファイルに外部化する方法はありますか。名前付きクエリが多すぎるため、エンティティクラスの先頭で @NamedQueries および @NamedQuery を使用すると、問題が発生します。

複数のファイルに外部化する方法はありますか?

役に立ちましたか?

解決

ドメインオブジェクトのルートパッケージなどの package-info.java クラスにクエリを配置できます。ただし、 javax.persistence からではなく、Hibernate独自の @NamedQueries および @NamedQuery 注釈を使用する必要があります。

package-info.java ファイルの例:

@org.hibernate.annotations.NamedQueries({
    @org.hibernate.annotations.NamedQuery(
        name = "foo.findAllUsers", 
        query="from Users") 
}) 

package com.foo.domain;

次に、パッケージを AnnotationConfiguration に追加する必要があります。私はSpringを使用しているため、 annonatedPackages プロパティを設定する必要があります:

<bean id="sessionFactory" 
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="annotatedClasses">
      <list>
      ...
      </list>
</property>
<property name="annotatedPackages">
  <list>
      <value>com.foo.domain</value>
  </list>
</property>

同じファイルにタイプとフィルターの定義を入れることもできます。

他のヒント

注釈の属性/プロパティ値はコンパイル時に利用可能でなければならないため、これは可能だとは思わない。したがって、何らかのプロセスで読み込む必要があるファイルに文字列を外部化することはできません。

package-info.javaが提供できるものがあるかどうかを確認しようとしましたが、何も見つかりませんでした。

組織の代替戦略として、クエリをクラスとして定数として保存することができます。

エンティティクラス:

@NamedQuery(name="plane.getAll", query=NamedQueries.PLANE_GET_ALL)

クエリ定数のクラスを定義します:

public class NamedQueries {
    ...
    public static final String PLANE_GET_ALL = "select p from Plane p";
    ...
}

これは、著者が(java以外のファイルに外部化するために)求めたものとは異なるかもしれませんが、これが私が解決した方法です:

1。)アプリケーションコンテキストxmlファイルで、 mappingResources をsessionFactory

に追加しました
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mappingResources">
      <list>
        <value>META-INF/Country.hbm.xml</value>
      </list>
    </property>
    <property name="annotatedClasses">
        <util:list>
            <value>com.example.Country</value>
        </util:list>
    </property>
    <property name="hibernateProperties" ref="hibernateProperties" />
</bean>

そしてそのCountry.hbm.xmlに私が持っている

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings 
    xmlns="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
    version="2.0">

    <entity class="com.example.Country">

        <named-query name="countryFindByCode">
            <query><![CDATA[
                select c
                  from Country c
                 where c.code = :code
            ]]></query>
        </named-query>

        <named-query name="countryFindByName">
            <query><![CDATA[
                select c
                  from Country c
                 where c.name = :name
            ]]></query>
        </named-query>

    </entity>

</entity-mappings>

名前付きクエリを定義するためだけに使用しました。残りのエンティティ設定はアノテーションにあります。

多分それは誰かを助ける。

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mappingResources">
      <list>
        <value>META-INF/Country.hbm.xml</value>
      </list>
    </property>
    <property name="annotatedCla 
                  from Country c
                 where c.name = :name
            ]]></query>
        </named-query>

    </entity>

</entity-mappings>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top