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 属性。
所以你可以
- 更改 class(或创建另一个 class)以仅包含您需要的字段
- 或将 class 的序列化更改为 return 只有您需要的字段(或作为选项跳过空字段)
- 或将
BasicBoardArticle
的 return 实例转换为其他 class 没有这些字段的实例
mybatis中单独映射
创建一个单独的 class,只包含您需要的字段。然后为它创建一个单独的 resultMap
(如果您使用 autoMapping=true
,唯一真正的区别是您在 resultMap
中指定的目标类型)。
然后您要么在映射器中创建一个单独的查询,要么使用 <if>
.
根据某些参数值有条件地包含字段
更改序列化形式
如果 selectAll
仅用于表示层,您可以自定义 class 的序列化方式。为它创建自定义序列化程序并在该特定端点的控制器中使用它(尽管没有简单的方法可以做到这一点,除非您使用不同的请求内容类型)。或者,如果您负担得起 class.
,则将 jackson 配置为不 return 空字段
转换为其他类型
如果 selectAll
的结果不仅在视图层中使用,那么将 returned BasicBoardArticle
转换为仅包含您需要的字段的其他类型可能是有意义的。
我有一些关于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 属性。
所以你可以
- 更改 class(或创建另一个 class)以仅包含您需要的字段
- 或将 class 的序列化更改为 return 只有您需要的字段(或作为选项跳过空字段)
- 或将
BasicBoardArticle
的 return 实例转换为其他 class 没有这些字段的实例
mybatis中单独映射
创建一个单独的 class,只包含您需要的字段。然后为它创建一个单独的 resultMap
(如果您使用 autoMapping=true
,唯一真正的区别是您在 resultMap
中指定的目标类型)。
然后您要么在映射器中创建一个单独的查询,要么使用 <if>
.
更改序列化形式
如果 selectAll
仅用于表示层,您可以自定义 class 的序列化方式。为它创建自定义序列化程序并在该特定端点的控制器中使用它(尽管没有简单的方法可以做到这一点,除非您使用不同的请求内容类型)。或者,如果您负担得起 class.
转换为其他类型
如果 selectAll
的结果不仅在视图层中使用,那么将 returned BasicBoardArticle
转换为仅包含您需要的字段的其他类型可能是有意义的。