Soy nuevo en Hibernate y estoy tratando de averiguar cómo consultar una relación de muchos a muchos mapeada como una entidad debido a la necesidad de una columna adicional.

En particular, siguiendo el ejemplo que encontré en codejava.net ( http://www.codejava.net/frameworks/hibernate/hibernate-many-to-many-association-with-extra-columns-in-join-table-example < / a>) Mapeé la relación de esta manera:

Student.java

@Entity
public class Student implements Serializable {

    @Id
    @Column
    private String email;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String surname;

    // Constructor, getters, setters, hashcode, equals
 }

Course.java

@Entity
@Table( 
    uniqueConstraints = @UniqueConstraint(
                            columnNames {"name","year"})
)
public class Course implements Serializable {

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

    @Column
    private String name;

    @Column
    private String year;

    @OneToMany(mappedBy = "course")
    private Set<Student_Course> students = new LinkedHashSet<>();

    // Constructor, getters, setters, hashcode, equals
}

Student_Course.java

@Entity
public class Student_Course implements Serializable {

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

    @ManyToOne
    @JoinColumn(name = "student_email")
    private Student student;

    @ManyToOne
    @JoinColumn(name = "course_id")
    private Course course;

    @Column(nullable = false,
            columnDefinition = "int default 0")
    private int score;

    // Constructor, getters, setters, hashcode, equals
}

Ahora lo que quiero conseguir es averiguar, con una consulta hql, los nombres y apellidos de los alumnos matriculados en un determinado curso (conozco el nombre y el año del curso). Sé que esto probablemente sea fácil, pero no puedo generar una consulta funcional en HQL.

Gracias de antemano.

1
Andrea Marcolin 22 ago. 2016 a las 21:16

2 respuestas

La mejor respuesta

Creo que esta consulta puede hacer lo que quieras:

SELECT sc.student.name, sc.student.surname
FROM Course c JOIN c.students sc 
WHERE c.name = :name AND c.year = :year
1
Leonardo Cruz 23 ago. 2016 a las 19:38
Select name, surname from Student where email in 
(Select student.email from Student_Course 
where Student_course.course.name=:courseName and Student_course.course.year= :year)

Y luego establezca tanto el nombre del curso como el año

Actualizar

Select student.name,student.surname from Student_Course 
where Student_course.course.name=:courseName and Student_course.course.year= :year
0
omkar sirra 23 ago. 2016 a las 03:37