Mybatis 如何在设置结果映射到 Dto 时 return 只选择列

Mybatis how to return only selected columns when set result map to Dto

我有一些关于mybatis和resultMap指定Dto的问题。

import lombok.Data;

import java.util.Date; 

@Data 
public class BasicBoardArticle {

private int articleIdx;

private int subBoardIdx;

private String title;

private int userIdx;

private String userNickName;

private String content;

private int good;

private int bad;

private Date createDate;

private Date updateDate;
}

我有上面的 Dto 然后 select 像下面的

<select id="selectAll" resultType="BasicBoardArticle" >
    SELECT
        articleIdx
        , bad
        , createDate
        , title
        , userNickName
    FROM BASICBOARDARTICLE
</select>

但是当控制器 return dto 'BasicBoardArticle' 时,它将 return 所有属性(例如 subBoardIdx、updateDate 等)都为空,我什至没有 select. 有没有办法从返回的 Dto 中删除这些属性?

如果我理解正确,您不希望在您的 DTO 中使用 subBoardIdx、updateDate,根据您的查询

<select id="selectAll" resultType="BasicBoardArticle" >
SELECT
    articleIdx
    , bad
    , createDate
    , title
    , userNickName
FROM BASICBOARDARTICLE
</select>

但是您的 DTO 具有这些字段,所以它们总是 return 那些,您可以通过将其映射到不具有这些字段的模型对象来更改它

像这样你想要的字段

public class BasicBoardArticleModel {

private int articleIdx;

private String title;

private String userNickName;

private int bad;

private Date createDate;

}

并且您可以将所需的字段从 DTO 映射到此数据模型并使用它

您无法完全按照 java 中的要求进行操作。

class BasicBoardArticle 具有属性,它们不能就此消失。想想使用这个 class 的代码。它可以试着说 updateDate。这是一件有效的事情,因为 class 定义了这个 属性 并且 java 是强类型的,所以你不能动态地 add/remove 属性。

所以你可以

  1. 更改 class(或创建另一个 class)以仅包含您需要的字段
  2. 或将 class 的序列化更改为 return 只有您需要的字段(或作为选项跳过空字段)
  3. 或将 BasicBoardArticle 的 return 实例转换为其他 class 没有这些字段的实例

mybatis中单独映射

创建一个单独的 class,只包含您需要的字段。然后为它创建一个单独的 resultMap(如果您使用 autoMapping=true,唯一真正的区别是您在 resultMap 中指定的目标类型)。

然后您要么在映射器中创建一个单独的查询,要么使用 <if>.

根据某些参数值有条件地包含字段

更改序列化形式

如果 selectAll 仅用于表示层,您可以自定义 class 的序列化方式。为它创建自定义序列化程序并在该特定端点的控制器中使用它(尽管没有简单的方法可以做到这一点,除非您使用不同的请求内容类型)。或者,如果您负担得起 class.

,则将 jackson 配置为不 return 空字段

转换为其他类型

如果 selectAll 的结果不仅在视图层中使用,那么将 returned BasicBoardArticle 转换为仅包含您需要的字段的其他类型可能是有意义的。