Присоединение ОДНОГО поля из другой Entity

133
23 августа 2021, 12:00

Я реализую RESTFul сервис, позволяющий возвращать информацию о пользователях. У меня есть два Entity, которые цепляются из БД.

Первая сущность, описывающая пользователя, берется из таблицы User и выглядит следующим образом:

import javax.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
    @Id
    @Column(name = "code")
    Long id;
    Long pos;
    Long sapid;
    String username;
    String firstName;
    String lastName;
    String middleName;
    @ManyToOne(fetch = FetchType.EAGER)
            @JoinColumn(name = "code",  insertable = false, updatable = false)
    Point point;
}

Следующая сущность описывает отделение, в котором работает указанный пользователь, берется из таблицы Point:

import javax.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Point {
    @Id
    @Column(name = "code")
    Long id;
    @Column(name = "name")
    String location;
    String zip;
    String regionCode;
    String city;
    String street;
    String house;
    String info;
}

Моей задачей является возврат JSON-а следующего содержания:

{
“id”:2356,
“user”:”user”,
“location”:”отделение1”    
}

Начав реализовывать DTO для возврата JSON я столкнулся с проблемой: при реализованной мной связи в Entity User в поле Point записывается целая привязанная сущность.

{
  "id": 41,
  "user": "user",
  "point": {
    "zip": "zip",
    "location" : "location1"
    "regionCode": "123",
    "city": "city",
    "street": "str",
    "house": "h2",
    "info": "some info"
  }
}

Вопрос: Как я должен преобразовывать сущность в процессе маппинга в дто, чтобы получить JSON требуемого мне формата? (цеплять из point только location, а не полную информацию о отделении). Хотелось бы избегать нативных SQL запросов и работать именно с объектным представлением, спасибо.

Answer 1

Любой метод с префиксом get будет обработан сериалайзером

class DTO{
    // сам поинт скрыт
    @JsonIgnore
    private Point point;
    // будто бы такое поле существует
    String getLocation(){
       return point.getLocation();
    }
...
}

А вообще, не передавайте сущности целиком в ДТО, если не хотите видетьполное содержание. Если вы хотите видеть там три поля, то создавай ДТо ровно с тремя полями

    class DTO{
        private Long id;
        private String user;
        private String location;
    ...
    }
dto.setId(42);
dto.setUser("user");
dto.setLocation("Some location");
READ ALSO
Как переделать программу, чтобы она могла работать с несколькими запросами?

Как переделать программу, чтобы она могла работать с несколькими запросами?

Есть программа, которой подается на вход 2 натуральных числа: размеры таблицы (а*b) и строка вида ADD (число) (число)Оба числа являются координатами...

88
Ошибки в пути к картинке, как исправить

Ошибки в пути к картинке, как исправить

У меня есть отдельный файл с картинками под названием src, в котором файл img и там картинкиФайл Src я назначил права Resources Root

287
Класс обёртка Integer

Класс обёртка Integer

Почему во всех примерах, я вижу вот такое: Integer a = new Integer(242); - хотя этот вариант деприкейтед, в идее прям зачеркивает этот кодПочему никто не показывает...

168
Как сделать зависимость между кнопкой и option?

Как сделать зависимость между кнопкой и option?

Как в зависимости от выбранной опции тега select, содержащей data-id, привязать его к кнопке, те при выборе 1, кнопка получала data-id = 1 и тд

87