4

我有一个包含相关实体集合的实体。

public class Student{

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "COURSE_STUDENT_ID" , insertable=false,updatable=false)
private Set <Course> courses;

我想按课程名称和学生班级 ID 过滤学生。现在我已经弄清楚了如何按类 id 过滤,但我不知道如何按 courseId 过滤,因为 Student 实体有一组课程并且表是相关的。我已经阅读了一些文章,但没有代码与我已经阅读的代码相匹配。

CriteriaBuilder criteriaBuilder = persistenceStore.createCriteriaBuilder();
CriteriaQuery<Object> criteria = criteriaBuilder.createQuery();
Root<Student> root = criteria.from(Student.class);
List<Predicate> params = new ArrayList<Predicate>();

params.add(criteriaBuilder.equal(root.get("classId"),classId));

Predicate[] predicates = new Predicate[params.size()];
params.toArray(predicates);
criteria.select(root);
criteria.where(criteriaBuilder.and(predicates));
Query query = persistenceStore.createQuery(criteria);
List<Student> resultList = query.getResultList();
4

2 回答 2

6

首先,您的实体中存在错误:在您的情况下JoinColumn,注释适用于关系反面的实体Course

所以,如果Course实体有一个属性student,学生有一个属性,如:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "student")
private Set<Course> courses;

并且在您拥有的课程实体中(这里还指出,在数据库中,表课程有一个名为“学生”的字段:

@JoinColumn(name = "student", referencedColumnName = "id")
@ManyToOne(optional = false)
private Student student;

阅读此链接以获取有关如何映射实体关系的入门级说明。

关于 Criteria Query,由于您想检索StudentS 的 List,您可以以更安全的方式定义您的 CriteriaQuery:

CriteriaQuery<Student> criteria = criteriaBuilder.createQuery(Student.class);

关于这个问题,您必须以这种方式加入表格:

SetJoin<Student, Course> courses = root.join("courses");

或者,使用元模型:

SetJoin<Student, Course> courses = root.join(Student_.courses);

(如果 OneToMany 属性被定义为 aList或 a Collection,您将不得不使用相应的ListJoinCollectionJoin类)。

在课程上,您可以应用所需的Predicate条件(假设 Course 实体有一个名为 的字符串属性courseName):

Predicate p = criteriaBuilder.equal(courses.get("courseName"), "name-to-look-for");

或者,使用元模型:

Predicate p = criteriaBuilder.equal(courses.get(Course_.courseName), "name-to-look-for");

最后,为了正确连接谓词列表,您可以(至少)使用两种技术:

Predicate p1 = ...;
Predicate p2 = ...;

criteria.where(criteriaBuilder.and(p1, p2));

或者

List<Predicate> conditions = new ArrayList<Predicate> ();
conditions.add(p1);
conditions.add(p2);
criteria.where(conditions.toArray(new Predicate[] {}));

另请参阅这篇出色的文章

于 2013-01-20T09:32:47.180 回答
0

类型不匹配:无法从 cascadetype 转换为 cascadetype[]

答案是:

导入 javax.persistence.CascadeType;

导入这一行

于 2018-01-09T17:44:58.237 回答