'spring data jpa query to retrieve List of objects that are not of the type of the actual repository

I'm using a seperate class StudentSubject to map a many to many relationship because i use additional columns for the mapping(boolean favorite and int amountOfStars).

I have a repository for StudentSubject class:

@Repository
public interface StudentSubjectRepository extends JpaRepository<StudentSubject, Long> {

    public List<Subject> findAllByStudentStudentIdAndFavoriteTrue(Long studentId);
}

I'm trying to retrieve a list of Subject objects instead of StudentSubject objects. How can this be done?

StudentSubject class:

public class StudentSubject {

    @Id
    @SequenceGenerator(
            name = "student_subject_sequence",
            sequenceName = "student_subject_sequence",
            allocationSize = 1
    )
    @GeneratedValue(
            strategy = GenerationType.SEQUENCE,
            generator = "student_subject_sequence"
    )
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "STUDENT_ID")
    private Student student;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "SUBJECT_ID")
    private Subject subject;

    private int amountOfStars;

    private boolean favorite;

}

subject class:

public class Subject {

    @Id
    @SequenceGenerator(
            name = "subject_sequence",
            sequenceName = "subject_sequence",
            allocationSize = 1
    )
    @GeneratedValue(
            strategy = GenerationType.SEQUENCE,
            generator = "subject_sequence"
    )
    private Long subjectId;
    private String title;
    private String description;
    private int amountOfStudents;

    @ManyToMany(
            cascade = {CascadeType.PERSIST, CascadeType.REFRESH}
    )
    @JoinTable(
            name = "subject_promotor",
            joinColumns = @JoinColumn(
                    name = "subject_id",
                    referencedColumnName = "subjectId"
            ),
            inverseJoinColumns = @JoinColumn(
                    name = "promotor_id",
                    referencedColumnName = "promotorId"
            )
    )
    private List<Promotor> promotorList;


    @ManyToMany(
            cascade = {CascadeType.PERSIST, CascadeType.REFRESH}
    )
    @JoinTable(
            name = "subject_topic",
            joinColumns = @JoinColumn(
                    name = "subject_id",
                    referencedColumnName = "subjectId"
            ),
            inverseJoinColumns = @JoinColumn(
                    name = "topic_id",
                    referencedColumnName = "topicId"
            )
    )
    private List<Topic> topicList;


    @ManyToMany(
            cascade = {CascadeType.PERSIST, CascadeType.REFRESH}
    )
    @JoinTable(
            name = "subject_targetAudience",
            joinColumns = @JoinColumn(
                    name = "subject_id",
                    referencedColumnName = "subjectId"
            ),
            inverseJoinColumns = @JoinColumn(
                    name = "targetAudience_id",
                    referencedColumnName = "targetAudienceId"
            )
    )
    private List<TargetAudience> targetAudienceList;

    private Boolean approved;

    @ManyToOne()
    @JoinColumn(name="employer_id", referencedColumnName = "employerId")
    private Employer employer;
}

student class:

public class Student {

    @Id
    @SequenceGenerator(
            name = "student_sequence",
            sequenceName = "student_sequence",
            allocationSize = 1
    )
    @GeneratedValue(
            strategy = GenerationType.SEQUENCE,
            generator = "student_sequence"
    )
    private Long studentId;

    @OneToOne(
            cascade = CascadeType.ALL,
            fetch = FetchType.EAGER,
            optional = false
    )
    @JoinColumn(
            name = "user_id",
            referencedColumnName = "userId"
    )
    private User user;

    @OneToOne(
            cascade = CascadeType.ALL,
            fetch = FetchType.EAGER,
            optional = true
    )
    @JoinColumn(
            name = "target_audience",
            referencedColumnName = "TargetAudienceId"
    )
    private TargetAudience targetAudience;





Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source