Alexiuscrow
@Alexiuscrow

Hibernate. Как построить sql запрос в xml?

Есть мапинговый xml-файл:
<?xml version="1.0" ?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.example.MyObject" table="OWNER"
           where="service = 462">

        <id name="id" column="id" unsaved-value="null"/>

        <property name="name" column="name"  insert="false" update="false"/>
        <property name="description" column="description" insert="false" update="false"/>

    </class>
</hibernate-mapping>

Класс MyObject также должен содержать набор объектов класса HerObject:
<set name="herObjects" lazy="false">
        <key />
        <one-to-many class="com.example.HerObject"/>
</set>

но получить herObjects нужно при помощи сложного sql-запроса. Для этого указываю конструкцию (в примере sql упрощён):
<sql-query name="herObjSQLQuery">
        <load-collection alias="ho" role="com.example.MyObject.herObjects"/>
        <![CDATA[
        select {ho.*} from her_obj ho where owner_id = :id
        ]]>
</sql-query>

, где вместо :id по задумке должен быть подставлен id текущего елемента MyObject. В блок set также добавил строку:
<loader query-ref="com.example.MyObject.herObjSQLQuery" />

В результате получился следующий xml:
<?xml version="1.0" ?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

    <hibernate-mapping>
        <class name="com.example.MyObject" table="AAA"
               where="service = 462 and status = 1 and conference_number > 0">

            <id name="id" column="id" unsaved-value="null"/>

            <property name="name" column="name"  insert="false" update="false"/>
            <property name="description" column="description" insert="false" update="false"/>

            <set name="herObjects" lazy="false">
                   <key />
                   <one-to-many class="com.example.HerObject"/>
                   <loader query-ref="com.example.MyObject.herObjSQLQuery" />
            </set>

            <sql-query name="herObjSQLQuery">
                   <load-collection alias="ho" role="com.example.MyObject.herObjects"/>
                   <![CDATA[
                   select {ho.*} from her_obj ho where owner_id = :id
                   ]]>
            </sql-query>

        </class>
    </hibernate-mapping>

В чём ошибка? Как в sql-запрос подставить текущее значение id объекта MyObject?
  • Вопрос задан
  • 197 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы