我对mybatis和指定的Dto的resultMap有一些疑问。
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 id="selectAll" resultType="BasicBoardArticle" >
SELECT
articleIdx
, bad
, createDate
, title
, userNickName
FROM BASICBOARDARTICLE
</select>
但是当控制器返回dto'BasicBoardArticle'时,它将所有属性(例如subBoardIdx,updateDate等)返回为空,而我什至没有选择。 有什么办法可以从重做Dto中摆脱掉这些属性?
答案 0 :(得分:0)
如果我已正确理解您不希望在查询时在DTO中使用subBoardIdx,updateDate
<select id="selectAll" resultType="BasicBoardArticle" >
SELECT
articleIdx
, bad
, createDate
, title
, userNickName
FROM BASICBOARDARTICLE
</select>
但是您的DTO具有这些字段,以便始终返回这些字段,您可以通过将其映射到不具有这些字段的模型对象来更改它
类似这样的字段
public class BasicBoardArticleModel {
private int articleIdx;
private String title;
private String userNickName;
private int bad;
private Date createDate;
}
您可以将所需的字段从DTO映射到此数据模型并使用它
答案 1 :(得分:0)
您不能完全按照Java的要求进行操作。
类BasicBoardArticle
具有属性,它们不能仅仅从中消失。想想使用此类的代码。它可以尝试说出updateDate
。这是正确的做法,因为该类定义了此属性,并且Java是强类型的,因此您不能动态添加/删除属性。
因此您可以
BasicBoardArticle
实例仅使用所需字段创建一个单独的类。然后为其创建一个单独的resultMap
(如果使用autoMapping=true
,则唯一的区别是您在resultMap
中指定的目标类型)。
然后,您要么在mapper中创建一个单独的查询,要么使用<if>
根据某些参数值有条件地包括这些字段。
如果selectAll
仅用于表示层,则可以自定义类的序列化方式。要么为其创建自定义序列化程序,然后在控制器中将其用于该特定端点(尽管没有简单的方法可以做到这一点,除非您使用不同的请求内容类型)。或者,如果可以负担得起的话,将杰克逊配置为不返回空字段。
如果不仅在视图层中使用selectAll
的结果,还可以将返回的BasicBoardArticle
转换为仅包含所需字段的其他类型。