2009-03-02 9 views

答えて

9

あなたがルート、たとえば、で、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にパッケージを追加する必要があります。私はそこにそれが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> 

+0

私の見解では、これはクエリの外部化ではなく、クラスでコンパイルされていて、エンティティクラスで数十のクエリを持つこと、またはパッケージ情報クラスでさらに多くのクエリを持つことはエンティティを選択します。 IMHOこれはこの質問の正解ではありませんが、なぜそれが受け入れられるのかわかりません - > -1 – Betlista

+0

+1私にとっては大丈夫です。 Java ConfigとXM​​Lを使って外部化する方法を示しています。 downvotingの前に質問を読むと、彼はクラス内にNamedQueryを持たないことを明確に述べています。 – Augusto

3

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

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"; 
    ... 
} 
+1

このソリューションはNamedQueriesの外部化に関するものではありません、あなただけのクラスのプレーンな文字列プロパティにそれらを回っています。意味は失われます。 – Augusto

3

は多分これは(非Javaファイルに外部化する)ためにどのような著者が尋ね正確ではありませんが、これは私がそれに解決する方法である:私はSessionFactoryの

mappingResourcesを追加しました私のアプリケーションコンテキストxmlファイルに

1.)私は名前付きクエリを定義するには、エンティティのその他の構成はannotatであることを使用

<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> 

を持っていますイオン。

多分それが誰かを助けます。

-2
<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> 
+0

少し詳しい説明は? –

関連する問題