Mybatis, как вернуть только выбранные столбцы, когда установить карту результатов в Dto - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть вопрос о 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 id="selectAll" resultType="BasicBoardArticle" >
    SELECT
        articleIdx
        , bad
        , createDate
        , title
        , userNickName
    FROM BASICBOARDARTICLE
</select>

, но когда контроллер возвращает dto 'BasicBoardArticle', он будет возвращать все свойства (такие как subBoardIdx, updateDate и т. д.) как ноль, которые я даже не выбрал.есть ли какой-нибудь способ избавиться от этих свойств из возвращающегося Dto?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вы не можете делать в точности то, что вы просите в Java.

У класса BasicBoardArticle есть свойства, и они не могут просто исчезнуть из него.Подумайте о коде, который использует этот класс.Он может попытаться сказать "1004".И это правильно, поскольку класс определяет это свойство, а java строго типизирован, поэтому вы не можете динамически добавлять / удалять свойства.

Так что вы можете либо

  1. изменитькласс (или создать другой класс), чтобы иметь только те поля, которые вам нужны
  2. , или изменить сериализацию класса так, чтобы она возвращала только те поля, которые вам нужны (или в качестве опции пропустить пустые поля)
  3. или преобразуйте экземпляр BasicBoardArticle, который возвращается в другой класс, который не имеет этих полей

Отдельное отображение в mybatis

Создайте отдельный класс только с теми полями, которые вынеобходимость.Затем создайте для него отдельный resultMap (если вы используете autoMapping=true, единственная реальная разница - это тип цели, который вы указали в resultMap).

Затем вы создаете отдельный запрос в mapper или включаете поля, условно основанные на некотором значении параметра, используя <if>.

Изменить сериализованную форму

Если selectAll равноиспользуется только на уровне представления, вы можете настроить сериализацию класса.Либо создайте для него настраиваемый сериализатор и используйте его в контроллере для этой конкретной конечной точки (хотя простого способа сделать это нет, если вы не используете разные типы содержимого запроса).Или настройте Джексон так, чтобы он не возвращал пустые поля, если вы можете себе это позволить для этого класса.

Преобразовать в другой тип

Если результат selectAll используется не только в слое вида, это может иметь смыслпреобразовать возвращенный BasicBoardArticle в другой тип, в котором есть только те поля, которые вам нужны.

0 голосов
/ 23 сентября 2018

ЕСЛИ я правильно понял, что вы не хотите использовать subBoardIdx, updateDate в вашем DTO, по вашему запросу

<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 в эту Модель данных ииспользуйте это

...