1

私はいくつかの学術的なタスクに取り組んでおり、立ち往生しています。状況は次のとおりです
。3 つの単純なデータベース テーブルと、それらから生成された Java @Entity クラスがあります。

テーブルマーク:
STUDENT_ID (PK)
SUBJECT_ID (PK)
MARK

public class Mark implements Serializable {
    private BigDecimal mark;
    @Id
    @Column(name = "STUDENT_ID", nullable = false, insertable = false, updatable = false)
    private BigDecimal studentId;
    @Id
    @Column(name = "SUBJECT_ID", nullable = false, insertable = false, updatable = false)
    private BigDecimal subjectId;
    @ManyToOne
    @JoinColumn(name = "SUBJECT_ID")
    private Subject subject;
    @ManyToOne
    @JoinColumn(name = "STUDENT_ID")
    private Student student;
(...)
}

表 Student:
INDEX_NO (PK)
FNAME
LNAME
FACULTY_ID

public class Student implements Serializable {
    @Column(name = "FACULTY_ID", nullable = false)
    private BigDecimal facultyId;
    @Column(nullable = false, length = 20)
    private String fname;
    @Id
    @Column(name = "INDEX_NO", nullable = false)
    private BigDecimal indexNo;
    @Column(nullable = false, length = 20)
    private String lname;
    @OneToMany(mappedBy = "student")
    private List<Mark> marksList1;
(...)
}

表 生徒:
ID (PK)
NAME

public class Subject implements Serializable {
    @Id
    @Column(nullable = false)
    private BigDecimal id;
    @Column(nullable = false, length = 60)
    private String name;
    @OneToMany(mappedBy = "subject")
    private List<Mark> marksList;
(...)
}

タスクは 2 つ
のリストを取得することです。
2. 特定の学生がマークを持っていない科目のリスト。

私はSQLがあまり得意ではないので、クエリの構築に問題があります。JPAのような方法、つまりJPQL、Criteria APIで解決できます。

だから私はあなたに助けを求めています。
ご関心をお寄せいただきありがとうございます。

4

1 に答える 1

1

これが正しいかどうかはわかりませんが、問題の解決に役立つ可能性があります。JPQL の size() 関数は、コレクションをカウントできます。

これらは2つのJPQLクエリです

1)

select m.student
from Mark m
where size(m.subject) <> 
    size(select s from Subject s)

2)

select s
from Subject s
where s not in 
    (select m.s from Mark m where m.student.indexNo = :indexNo) 

:indexNo は、パラメーターを使用して設定する必要がある学生の ID です。

于 2012-04-21T13:37:09.407 に答える