Возвращает данные двух таблиц, используя mysql объединение как один java объект при загрузке Spring - PullRequest
2 голосов
/ 19 февраля 2020

Таблица CPT

@Entity
@Table(name = "CPT")
public class CPTCodeset {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Id")
    private int id;

    @Column(name = "Code")
    private String code;

    @Column(name = "Description")
    private String desc;
//getters and setters
}

Таблица процедур CPT

@Entity
@Table(name = "cptprocedures")
public class CPTProcedures {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Id")
    private int Id;

    @OneToOne(fetch=FetchType.EAGER)
    @JoinColumn(name = "ProcedureId")
    private Procedure procedure;
    @Transient
    private int procedureId;

    @OneToOne(fetch=FetchType.EAGER)
    @JoinColumn(name = "CPTCodeSet")
    private CPTCodeset cpt;
    @Transient
    private int cptCodeSet;
//getters and setters
}

CPTRepository

@Query(nativeQuery = true, value = "SELECT cp.ProcedureId,c.Code,c.Description FROM cptprocedures cp JOIN CPT c ON cp.CPTCodeSet = c.Id where c.Description like \"%ane\";")
List<CPTCodeset> findBySearch(@Param("searchString") String searchString);

Этот запрос о возврате данных - это то, что я хочу. Но как я могу сопоставить эти данные в один объект, который включает в себя 2 таблицы.

Как я могу сделать это, используя @Entity без создания таблицы. Есть предложения?

Ответы [ 3 ]

3 голосов
/ 19 февраля 2020
@Query("SELECT new com.dto.ProduceCPT(cp.ProcedureId, c.Code, c.Description) FROM cptprocedures cp JOIN CPT c ON cp.CPTCodeSet = c.Id where c.Description like \"%ane\" ")
List< ProduceCPT> fetchProduceCPT();
0 голосов
/ 19 февраля 2020

Вы должны заменить desc имя поля. Лучше не использовать JPA зарезервированные слова

@Entity
@Table(name = "CPT")
public class CPTCodeset {
    //fields

    @Column(name = "Description")
    private String description; 

    //getters and setters
}

Чтобы получить результат запроса в виде List<Object[]>

@Query("select cp.procedure.id, c.code, c.description "
         + "from CPTProcedures cp join cp.cpt c "
         + "where c.description like :searchString")
List<Object[]> findBySearch(@Param("searchString") String searchString);

или создать класс DTO с соответствующим конструктором SearchResultDto(int, String, String) и использовать this

@Query("select new yourproject.dto.SearchResultDto(cp.procedure.id, c.code, c.description) "
         + "from CPTProcedures cp join cp.cpt c "
         + "where c.description like :searchString")
List<SearchResultDto> findBySearch(@Param("searchString") String searchString);

Использование репозитория:

// description contains searchString  
List<SearchResultDto> dtos1 = repository.findBySearch("%" + searchString + "%");

// description start with searchString
List<SearchResultDto> dtos2 = repository.findBySearch("%" + searchString); 

// description end with searchString
List<SearchResultDto> dtos3 = repository.findBySearch(searchString + "%");
0 голосов
/ 19 февраля 2020

Вы делаете это неправильно, если вы используете JPA и все еще думаете о таблицах в первую очередь. Весь смысл JPA состоит в том, чтобы SQL генерировалось из объектов, чтобы вы могли притворяться, что реляционная модель не существует

Для этого примера вы можете использовать интерфейс проекции

Это может решить вашу проблему, вы делаете проекцию, а затем вставляете информацию в объект WrapperObject. Но вы не можете сделать обертку в вашем JPARepository, если эта обертка не существует в вашей базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...