Hibernate无法加载自定义SQL集合

时间:2010-05-21 17:09:23

标签: sql hibernate mapping

有一个表格项目,

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数据库。

添加2010/05/23

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>

1 个答案:

答案 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)

免责声明:未经测试。