Как экранировать именованные запросы в приложении аннотаций Hibernate? - PullRequest
10 голосов
/ 02 марта 2009

Есть ли способ вывести именованные запросы HQL во внешний файл. У меня слишком много именованных запросов, и использование @NamedQueries и @NamedQuery во главе моих классов сущностей причиняет боль.

Есть ли способ экспортировать несколько файлов?

Ответы [ 4 ]

10 голосов
/ 03 марта 2009

Вы можете поместить запросы в класс package-info.java, скажем, в корневой пакет объектов вашего домена. Однако вы должны использовать собственные аннотации @NamedQueries и @NamedQuery в Hibernate, а не аннотации javax.persistence.

.

Пример package-info.java file:

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

Вы также можете поместить определения типов и фильтров в один и тот же файл.

3 голосов
/ 04 марта 2013

Может быть, это не совсем то, о чем просил автор (для вывода в файл, отличный от 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>

Я использовал это просто для определения именованных запросов, остальная часть конфигурации сущности находится в аннотациях.

Может быть, это кому-нибудь поможет.

3 голосов
/ 03 марта 2009

Я не думаю, что это возможно, поскольку значения атрибута / свойства аннотации должны быть доступны во время компиляции. Поэтому строки не могут быть переданы в файл, который должен быть прочитан каким-либо процессом.

Я пытался найти, есть ли что-то, что может предоставить 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";
    ...
}
0 голосов
/ 07 сентября 2016
<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...