Как построить экземпляр модели из нескольких столбцов с помощью JPA - PullRequest
1 голос
/ 14 февраля 2020

У меня есть такой сценарий, где есть три сущности, каждая из которых имеет около 20 столбцов, предположим, что все являются уникальными именами, 20 * 3 - это 60 уникальных имен столбцов. Затем мне нужно получить некоторые конкретные поля, например, 30 полей, соединяя все 3. Поэтому у меня есть сопоставления в каждой сущности. Затем, чтобы выбрать только эти 30 полей, я понимаю, что я должен только выбрать их, используя множественный выбор Но есть ли эффективный способ сделать это? Как вместо написания 30 имен столбцов в моем коде, могу ли я иметь модель, которая определяет все эти поля, а затем передать эту модель в предложении select , чтобы она выбирала поля или что-то подобное.

Тогда Entity 1: -

public class CourseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
long id;

String name;

String descr;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "univ_id")
UniversityEntity university;

Entity 2: -

public class StudentEntity {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;

@Column(name = "grad_year")
private int gradYear;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "course_id")
CourseEntity courses;

Entity 3: -

public class UniversityEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
long id;

String name;

String desrc;

@OneToOne(mappedBy = "university")
CourseEntity courses;
}

Объект модели, который я хочу: -

public class StudentModel {

private int disbursementId;
private String payeeId;
private String courseName;
private String offeredBy;

}

Но меня беспокоит место, выберите запрос: -

    CriteriaQuery<StudentModel> criteriaQuery = cb.createQuery(StudentModel.class);

    Root<StudentEntity> root = criteriaQuery.from(StudentEntity.class);
    Join<StudentEntity, CourseEntity> student_course = root.join("courses");
    Join<CourseEntity, UniversityEntity> university_course = student_course.join("university"); 
    criteriaQuery.multiselect(
            root.get("id").alias("disbursement_id")
            , root.get("firstName").alias("payee_id")
            , student_course.get("name").alias("course_name")
            , university_course.get("name").alias("offered_by")
            )
            .where(cb.equal(root.get("gradYear"), 2015));

    TypedQuery<StudentModel> query = em.createQuery(criteriaQuery);
    List<StudentModel> results = query.getResultList();

Можем ли мы на самом деле пройти как,

    CriteriaQuery<StudentModel> criteriaQuery = cb.createQuery(StudentModel.class);

    Root<StudentEntity> root = criteriaQuery.from(StudentEntity.class);
    Join<StudentEntity, CourseEntity> student_course = root.join("courses");
    Join<CourseEntity, UniversityEntity> university_course = student_course.join("university"); 
    criteriaQuery.multiselect(
            **StudentModel**
            )
            .where(cb.equal(root.get("gradYear"), 2015));

    TypedQuery<StudentModel> query = em.createQuery(criteriaQuery);
    List<StudentModel> results = query.getResultList();

1 Ответ

0 голосов
/ 14 февраля 2020

Вы можете создать экземпляр модели, используя CriteriaBuild#construct вместо multiselect.

В вашем классе модели должен быть конструктор, принимающий все поля в качестве параметров:

public StudentModel(int disbursementId, String payeeId /**...**/) {/**...**/}

, затем вы можно использовать так:

criteriaQuery.select(cb.construct(StudentModel.class, root.get("id"), root.get("firstName") /**...**/));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...