Сопоставление сущности представления базы данных с простой сущностью и передача в DTO с использованием Spring Data - PullRequest
0 голосов
/ 11 октября 2018

Я только изучаю Spring Data.Я хочу сопоставить Entity представления базы данных с простым Entity и перейти к DTO, который будет содержать столбцы и сущности.Я понимаю, что могу использовать специальный вид базы данных, но мне нужно точно отобразить сущности Spring Data.У меня есть представление базы данных Entity "MentorStudents":

@Entity
@Table(name = "mentor_students")
@Immutable
public class MentorStudents implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "mentor_id", updatable = false, nullable = false)
    private Long mentorId;

    //This entity I need to map
    private Mentor mentor;

    @Column(name = "active_students")
    private Integer activeStudents;

    public MentorStudents() {
    }

    //getters, setters, equals, hashCode
}

sql представления базы данных вышеупомянутой сущности:

SELECT id AS mentor_id, active_students
   FROM mentor
LEFT JOIN ( SELECT mentor_id, count(mentor_id) AS active_students
   FROM contract
   WHERE close_type IS NULL
   GROUP BY mentor_id) active ON mentor.id = active.mentor_id
ORDER BY mentor.id;

И у меня есть простая сущность "Mentor":

@Entity
@Table(name = "mentor")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Mentor implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;

    @NotNull
    @Column(name = "first_name", nullable = false)
    private String firstName;

    @NotNull
    @Column(name = "last_name", nullable = false)
    private String lastName;

    @Column(name = "patronymic")
    private String patronymic;

    @Column(name = "phone")
    private String phone;

    @NotNull
    @Column(name = "email", nullable = false)
    private String email;

    @Column(name = "skype")
    private String skype;

    @Column(name = "country")
    private String country;

    @Column(name = "city")
    private String city;

    @Column(name = "max_students")
    private Long maxStudents;

    //getters, setters, equals, hashCode

Я должен получить DTO, который содержит все поля Mentor и поле MentorStudents "activeStudents" без поля "mentorId".Как это сделать?

1 Ответ

0 голосов
/ 12 октября 2018

Использовать проекцию данных пружины:

public interface YourDto {
  // all Mentor get fields
  String getFirstName();
  ...
  // activeStudents get field
  Integer getActiveStudents();
}

public interface YourRepository extends JpaRepository<YourEntity, Integer> {
  @Query(value = "select ...(all fields match YourDto) from Mentor m, MentorStudents s where m.id = s.mentorId and m.id = ?1")
  Optional<YourDto> findMyDto(Integer mentorId);
}
...