Domanda

Esiste un modo per esternalizzare le query denominate HQL in un file esterno. Ho troppe query nominate e l'utilizzo di @NamedQueries e @NamedQuery alla testa delle classi delle mie entità mi fa male.

Esiste un modo per esternalizzare a più file?

È stato utile?

Soluzione

Puoi inserire le query nella classe package-info.java , ad esempio nel pacchetto root dei tuoi oggetti di dominio. Tuttavia, è necessario utilizzare le annotazioni @NamedQueries e @NamedQuery di Hibernate, anziché quelle di javax.persistence .

Esempio pacchetto-info.java file:

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

package com.foo.domain;

Quindi, devi aggiungere il pacchetto al tuo AnnotationConfiguration . Uso Spring, quindi è necessario impostare la proprietà 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>

Puoi anche inserire definizioni di tipo e filtro nello stesso file.

Altri suggerimenti

Non penso che ciò sia possibile poiché i valori dell'attributo / proprietà Annotation devono essere disponibili al momento della compilazione. Pertanto, le stringhe non possono essere esternalizzate in un file che deve essere letto da una sorta di processo.

Ho provato a scoprire se c'era qualcosa che package-info.java poteva essere in grado di fornire, ma non ho trovato nulla.

Una strategia alternativa per l'organizzazione potrebbe essere l'archiviazione delle query come costanti in una classe.

Nella tua classe di entità:

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

Quindi definisci una classe per le tue costanti di query:

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

Forse non è esattamente quello che l'autore ha chiesto (esternalizzare un file non java), ma è così che l'ho risolto:

1.) nel mio file xml del contesto dell'applicazione ho aggiunto mappingResources a 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>

e in quel Country.hbm.xml l'ho

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

L'ho usato solo per definire le query con nome, il resto della configurazione dell'entità è nelle annotazioni.

Forse questo aiuta qualcuno.

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top