这是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>
提前致谢
答案 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放入集合中,那就更好了。
也许是一个愚蠢的建议,但谁知道呢?也许提示采用不同的方法? [哦,除了明显的:创建两个查询]