HQLという名前のクエリを外部ファイルに外部化する方法はありますか?名前付きクエリが多すぎて、使用@NamedQueries
し@NamedQuery
ていて、エンティティの先頭でクラスが痛いです。
複数のファイルに外部化する方法はありますか?
クエリをpackage-info.java
クラス、たとえばドメイン オブジェクトのルート パッケージに入れることができます。ただし、からのものではなく、 Hibernate 独自の@NamedQueries
およびアノテーションを使用する必要があります。@NamedQuery
javax.persistence
サンプル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>
タイプとフィルターの定義を同じファイルに入れることもできます。
たぶん、これは作者が(非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>
名前付きクエリを定義するためだけに使用しましたが、残りのエンティティ構成はアノテーションに含まれています。
多分それは誰かを助けます。
アノテーション属性/プロパティ値はコンパイル時に利用可能でなければならないため、これは可能ではないと思います。したがって、何らかのプロセスで読み込む必要があるファイルに文字列を外部化することはできません。
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";
...
}
<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>