Есть столик типа, как,
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>