resultMap用于复杂查询

时间:2014-05-29 12:58:38

标签: mybatis

我有一些查询返回没有任何对象的数据。

 SELECT  b.id,
            b.publisher_id,
            b.name,
            b.size,
            b.present,
            CASE WHEN b.id in (SELECT book_id FROM downloads) 
              THEN true
              ELSE false
            END as downloading,
            b.display,
            b.download_date
     FROM books as b
     WHERE b.publisher_id = ${pId} AND b.display = true
     LIMIT ${pageSize} OFFSET ${startId}

字段downloading在数据库中没有任何列。 对象b的映射器是

<resultMap id="bookMap" type="Book">
    <id column="id" property="id" />
    <result column="publisher_id" property="publisherId" />
    <result column="name" property="name" />
    <result column="size" property="size" />
    <result column="present" property="present" />
    <result column="display" property="display" />
    <result column="download_date" property="downloadDate" />
</resultMap>

如何为此类对象创建映射器 - 其中部分已存在resultMap但添加了新列。

1 个答案:

答案 0 :(得分:2)

其中一种方法是创建一个新类,其中包含具有下载状态的书:

class BookWithDownloadingStatus {
    private Book book;
    private boolean downloading;
    // I've omitted setters and getters
}

之后,您可以使用此类来映射上述查询的结果:

<resultMap id="bookWithDownloadingStatusMap" type="BookWithDownloadingStatus">
    <result column="downloading" property="downloading"/>
    <association property="book" resultMap="bookMap"/>
</resultMap>

<select id="getBookWithDownloadingStatus" resultMap="bookWithDownloadingStatusMap">
    -- the above select
</select>

顺便说一句,您的查询将无法正确执行分页。数据库不保证任何订单,没有订单限制和抵消几乎是无用的。您应始终指定排序,否则项目可能在页面之间随机分布。