【发布时间】:2013-01-03 13:22:57
【问题描述】:
我有一个包含相关实体集合的实体。
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();
【问题讨论】:
-
欢迎来到stackoverflow。感谢您提出的第一个问题。
-
不确定标准方式,但是,当我有类似的需求时,我使用查询语言,有关想法,请参见此处:en.wikibooks.org/wiki/Java_Persistence/JPQL(因为语法使用了 SQL 中的基本想法,所以很容易为我使用)。
-
我明白@PeterButkovic。但我的情况是过滤器是动态的。所以我不能硬编码查询。所以,如果用户想按类过滤,我添加 params.add (criteriaBuilder.equal(root.get("classId"),classId)); classId 没有问题,因为它是 Student 实体本身的属性。当用户想要通过我必须通过相关集合实体获取的 courseName 进行过滤时,就会出现问题。
标签: java hibernate jakarta-ee criteria-api