У меня есть такой сценарий, где есть три сущности, каждая из которых имеет около 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();