Hibernate не может загрузить пользовательскую коллекцию SQL - PullRequest
1 голос
/ 21 мая 2010

Есть столик типа, как,

code,name
01,parent1
02,parent2
0101,child11
0102,child12
0201,child21
0202,child22

Создание объекта java и hbm xml для сопоставления таблицы. Item.parent - это элемент, код которого равен первым двум символам его кода:

class Item{
    String code;
    String name;
    Item parent;
    List<Item> children;

    .... setter/getter....

}

<hibernate-mapping>
    <class name="Item" table="Item">
        <id name="code" length="4" type="string">
            <generator class="assigned" />
        </id>
        <property name="name" column="name" length="50" not-null="true" />

    <many-to-one name="parent" class="Item" not-found="ignore">
        <formula>
        <![CDATA[
        (select i.code,r.name from Item i where (case length(code) when 4 then i.code=SUBSTRING(code,1,2) else false end))
        ]]>
        </formula>
    </many-to-one>

        <bag name="children"></bag>


    </class>

</hibernate-mapping>

Я пытаюсь использовать формулу для определения отношения многие-к-одному, но она не работает! Что-то не так? Или есть другой метод?

Спасибо!

ps, я использую базу данных mysql.

добавить 2010/05/23

Ответ Паскаля правильный, но значение «ложь» должно быть заменено другим выражением, например «1 = 2». Так как значение «ложь» будет считаться столбцом таблицы .

select i.code
from Item i 
where (
  case length(code) 
    when 4 then i.code=SUBSTRING(code,1,2)
    else 1=2
  end)

И у меня есть еще один вопрос по поводу отображения детей в "bag". Для конфигурации "bag" нет опции конфигурации формул, но мы можем использовать "loader" для загрузки sql-запроса. Я настраиваю "bag" следующим образом Но он получает список, размер которого равен 0. Что с ним не так?

<class>
     ... ... 
   <bag name="children">
        <key />
        <one-to-many class="Item"></one-to-many>
        <loader query-ref="getChildren"></loader>
    </bag>

    </class>
    <sql-query name="getChildren">
    <load-collection alias="r" role="Item.children" />
        <![CDATA[(select {r.*} from Item r join Item o where
        o.code=:code and
         (
        case length(o.code) 
        when 2 then (length(r.code)=4 and SUBSTRING(r.code,1,2)=o.code) 
        else 1=2
        end ))]]>
    </sql-query>

1 Ответ

1 голос
/ 22 мая 2010

Согласно документации , вы должны вернуть значение вычисленного внешнего ключа, ничего более:

formula (необязательно): выражение SQLэто определяет значение для вычисляемого внешнего ключа.

Так что я бы ожидал запрос, подобный следующему:

select i.code
from Item i 
where (
  case length(code) 
    when 4 then i.code=SUBSTRING(code,1,2)
    else false
  end)

Отказ от ответственности: не проверено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...