多对多查询方式的一种写法

Student 和 teacher 是多对多的关系:

/**

*class Student

*/

@Entity
@Table(name = "students")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    protected Integer id;
    @Column(length = 50, nullable = false)
    protected String name;
    @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.LAZY)
    @JoinTable(name = "studentteacher", joinColumns = { @JoinColumn(name = "sid",nullable=true) }, inverseJoinColumns = {
            @JoinColumn(name = "tid",nullable=true) })
    protected List<Teacher> teachers = new ArrayList<Teacher>();

    public Student() {
    }
  set / get ...
}

/**

*class Teacher

*/

@Entity
@Table(name = "teachers")
public class Teacher {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    @Column(length = 50, nullable = false)
    private String name;
    private Integer age;
    @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.EAGER)
    @JoinTable(name = "studentteacher", joinColumns = { @JoinColumn(name = "tid",nullable=true) }, inverseJoinColumns = {
            @JoinColumn(name = "sid",nullable=true) })
    private List<Student> students = new ArrayList<Student>();

    public Teacher() {

    }

  set / get ...
}

根据老师查找所有学生的方法可以如下:

@PersistenceContext
private EntityManager entityManager;

public List<Student> getMyStudent(Teacher teacher) {
        Integer tid=teacher.getId();
        return entityManager.createQuery("select s from Student s inner join s.teachers as t  where t.id = :tid")
                .setParameter("tid", tid).getResultList();
    }

原文地址:https://www.cnblogs.com/ly-radiata/p/4747931.html