Unable to instantiate class with Spring Data JPA projection in ManyToMany relationship

89 Views Asked by At

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)

0

There are 0 best solutions below