使用Play查找多对多实体的交集的优雅方式

时间:2011-10-26 05:22:05

标签: java sql jpa playframework

假设我使用Play Framework的Model类实现了这样的Student实体:

@Entity
public class Student extends Model {

    public String name;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "student_subject",
        joinColumns = {@JoinColumn(name = "student_id", referencedColumnName = "id")},
        inverseJoinColumns = {@JoinColumn(name = "subject_id", referencedColumnName = "id")})
    public List<Subject> subjects;

    ...
}

主题看起来像这样:

@Entity
public class Subject extends Model {

    public String name;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "student_subject",
        joinColumns = {@JoinColumn(name = "subject_id", referencedColumnName = "id")},
        inverseJoinColumns = {@JoinColumn(name = "student_id", referencedColumnName = "id")})
    public List<Student> students;

    ...
}

使用Play是否有简单的方法! (如果不是,最好的方法是什么),找到所有与特定学生至少有一个共同主题的学生?

所以让我们说:

  • 学生A做数学,科学和英语
  • 学生B做科学和英语
  • 学生C做法语
  • 学生D做数学和法语

我希望能做到这么简单的事情:

List<Student> students = Student.find("subjects in ? and id <> ?", studentA.subjects, studentA.id).fetch();

我期望返回两名学生:B和D(因为学生B和D至少有一个与学生A共同的主题,通过上述查询传递)。

1 个答案:

答案 0 :(得分:4)

以下是我将使用的JPQL查询:

select s from Student s
inner join s.subjects subject
where subject in (:subjectsOfStudentA)
and s != :studentA

它与您的查询非常相似,但您需要一个联接才能在where子句中使用搜索到的学生的主题。