【问题标题】:Elegant way of finding intersection of Many-to-Many entities using Play使用 Play 查找多对多实体交集的优雅方法
【发布时间】:2011-12-15 11:38:24
【问题描述】:

假设我有一个这样的 Student 实体,使用 Play Framework 的 Model 类实现:

@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 相同的科目,通过上面的查询传入)。

【问题讨论】:

    标签: java sql jpa playframework


    【解决方案1】:

    这是我将使用的 JPQL 查询:

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

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

    【讨论】:

    • 像魅力一样工作!非常感谢。
    猜你喜欢
    • 2013-07-31
    • 1970-01-01
    • 2019-05-09
    • 2017-09-20
    • 1970-01-01
    • 2017-12-21
    • 2012-09-23
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多