Hibernateアノテーションアプリで名前付きクエリを外部化するにはどうすればよいですか?
質問
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>