有一个表格项目,
code,name
01,parent1
02,parent2
0101,child11
0102,child12
0201,child21
0202,child22
创建一个java对象和hbm xml来映射表.Part.parent是一个Item,其代码等于其代码的前两个字符:
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数据库。
Pascal's answer是正确的,但“false”值必须替换为其他表达式,例如“1 = 2”。因为“false”值将被视为表的一列。
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-query.I配置“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>
答案 0 :(得分:1)
根据documentation,您应该返回计算外键的值,仅此而已:
formula
(可选):一个SQL表达式,用于定义计算外键的值。
所以我希望这样的查询:
select i.code
from Item i
where (
case length(code)
when 4 then i.code=SUBSTRING(code,1,2)
else false
end)
免责声明:未经测试。