不同的集合取决于列值

时间:2012-05-23 20:02:18

标签: java sql postgresql mybatis

这是MyBatis的XML配置的一部分。

<sql id="selectElementWithAttributes">
    SELECT
    e.id as id,
    e.title as title,
    e.type as type,
    e.date as date,
    e.ownerid as ownerid,
    a.attributeid as attributeid,
    a.value as value,
    a.type as a_type
    FROM
    test_element as a
    LEFT JOIN
    test_elementattributes as a
    ON
    e.id
    = a.parentid
</sql>

现在我使用resultMap将列映射到我的Object。

<resultMap type="Element" id="rmElement">
    <id property="id" column="id" />
    <result property="title" column="title" />
    <result property="type" column="type" />
    <result property="date" column="date" />
    <result property="ownerid" column="ownerid" />
    <collection property="attributes" ofType="Attribute">
        <id property="{id=parentid,attributeid=attributeid}" />
        <result property="key" column="attributeid" />
        <result property="value" column="value" />
    </collection>
</resultMap>

问题是,我必须在我的Element对象中收集。 两个集合都包含属性。 区别在于属性的类型(映射到a_type)。 根据这种类型,我喜欢在集合1或集合2中拥有属性。 我玩弄了鉴别器,但是我真的不明白我在做什么而且它不起作用......

这是个主意,但是如何根据a_type切换集合?

<resultMap type="Element" id="rmElement">
    <id property="id" column="id" />
    <result property="title" column="title" />
    <result property="type" column="type" />
    <result property="date" column="date" />
    <result property="ownerid" column="ownerid" />
    <collection property="attributes" ofType="Attribute">
        <id property="{id=parentid,attributeid=attributeid}" />
        <result property="key" column="attributeid" />
        <result property="value" column="value" />
    </collection>
    <collection property="attributesOther" ofType="Attribute">
        <id property="{id=parentid,attributeid=attributeid}" />
        <result property="key" column="attributeid" />
        <result property="value" column="value" />
    </collection>
</resultMap>

提前致谢

1 个答案:

答案 0 :(得分:1)

从未使用过这些东西,所以只是一个想法。修改查询以返回两组属性,然后过滤掉读取端的NULL?

<sql id="selectElementWithAttributes">
    SELECT
    e.id as id,
    e.title as title,
    e.type as type,
    e.date as date,
    e.ownerid as ownerid,
    CASE WHEN a.type = 'attribute1' THEN a.attributeid ELSE NULL END as attribute1id,
    CASE WHEN a.type = 'attribute2' THEN a.attributeid ELSE NULL END as attribute2id,
    a.value as value,
    a.type as a_type
    FROM
    test_element as a
    LEFT JOIN
    test_elementattributes as a
    ON
    e.id
    = a.parentid
</sql>

然后将两个不同的集合放在result1和attribute2的resultmap中。两个集合都将获得完整集合,但对于不属于该集合的属性,值将为NULL。如果NULL是合法值,则使用不同的标志。如果有一种方法可以跳过将NULL放入集合中,那就更好了。

也许是一个愚蠢的建议,但谁知道呢?也许提示采用不同的方法? [哦,除了明显的:创建两个查询]