I'm unable to figure out how to write a jpql query for many to many mapping.
I have a Grievance entity which has a ManyToMany relation with Category entity.
public class Grievance {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
@Column(columnDefinition = "CHAR(36)")
@JdbcTypeCode(SqlTypes.VARCHAR)
private UUID id;
@Column(nullable = false)
private String title;
@Enumerated(EnumType.STRING)
private GrievanceStatus grievanceStatus;
@Column(nullable = false)
private String askedBy;
@CreationTimestamp
private LocalDateTime asked;
@UpdateTimestamp
private LocalDateTime modified;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "student_usn")
private Student student;
@ManyToMany
@JoinTable(
name = "grievance_category",
joinColumns = @JoinColumn(name = "grievance_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "category_name", referencedColumnName = "category"))
private List<Category> categories;
...other relations
}
To display all grievances raised by a student I made StudentGrievances dto
@Data
@NoArgsConstructor
@AllArgsConstructor
public class StudentGrievances {
private UUID id;
private String title;
private GrievanceStatus grievanceStatus;
private String askedBy;
private LocalDateTime asked;
private LocalDateTime modified;
private long timeTaken;
private List<Category> categories;
}
I wrote a query in student repository
@Query("SELECT new com.rnsit.studentgrievance.dto.student.StudentGrievances(g.id, g.title, g.grievanceStatus, g.askedBy, g.asked, g.modified, g.timeTaken, g.categories) FROM Grievance g JOIN g.categories c WHERE g.student.usn = :usn")
List<StudentGrievances> getGrievancesByUsn(String usn);
I'm getting the following error
Cannot instantiate class 'com.rnsit.studentgrievance.dto.student.StudentGrievances' (it has no constructor with signature [java.util.UUID, java.lang.String, com.rnsit.studentgrievance.entity.grievance.GrievanceStatus, java.lang.String, java.time.LocalDateTime, java.time.LocalDateTime, java.lang.Long, java.lang.String, java.lang.String], and not every argument has an alias)