Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按相关实体筛选休眠条件_Java_Hibernate_Jakarta Ee_Criteria Api - Fatal编程技术网

Java 按相关实体筛选休眠条件

Java 按相关实体筛选休眠条件,java,hibernate,jakarta-ee,criteria-api,Java,Hibernate,Jakarta Ee,Criteria Api,我有一个实体,它有一个相关实体的集合 public class Student{ @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinColumn(name = "COURSE_STUDENT_ID" , insertable=false,updatable=false) private Set <Course> courses; 公共班级学生{ @OneToMany(fetch=FetchTyp

我有一个实体,它有一个相关实体的集合

public class Student{

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "COURSE_STUDENT_ID" , insertable=false,updatable=false)
private Set <Course> courses;
公共班级学生{
@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
@JoinColumn(name=“COURSE\u STUDENT\u ID”,insertable=false,updateable=false)
私人设置的课程;
我想按课程名称和学生班级id筛选学生。目前,我已经解决了如何按班级id筛选的问题,但我不知道如何按班级id筛选,因为学生实体有一组课程,并且表是相关的。我读过一些文章,但没有代码与我已有的代码相匹配

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();
CriteriaBuilder-CriteriaBuilder=persistenceStore.createCriteriaBuilder();
CriteriaQuery criteria=criteriaBuilder.createQuery();
Root=标准.from(学生.class);
List params=new ArrayList();
参数add(criteriaBuilder.equal(root.get(“classId”),classId));
谓词[]谓词=新谓词[params.size()];
参数toArray(谓词);
条件。选择(根);
其中(criteriaBuilder.和(谓词));
Query Query=persistenceStore.createQuery(条件);
List resultList=query.getResultList();

首先,您的实体中有一个错误:
JoinColumn
注释适用于关系反面的实体,
课程

因此,如果
课程
实体有一个属性
学生
,学生有一个属性,如:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "student")
private Set<Course> courses;
阅读有关如何映射实体关系的入门级说明

关于Criteria查询,由于您希望检索
学生
的列表,因此可以以更安全的方式定义CriteriaQuery:

CriteriaQuery<Student> criteria = criteriaBuilder.createQuery(Student.class);
或者,使用元模型:

Predicate p = criteriaBuilder.equal(courses.get(Course_.courseName), "name-to-look-for");
最后,为了正确连接谓词列表,您可以(至少)使用两种技术:

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

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

List conditions=newarraylist();
条件。添加(p1);
条件。添加(p2);
其中(conditions.toArray(新谓词[]{}));

另请参见此极好的说明。

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

答案是:

导入javax.persistence.CascadeType


导入这一行

欢迎使用stackoverflow。谢谢你提出了一个很好的第一个问题。我不确定标准方式,但是,当我有类似的需求时,我使用了查询语言,有关想法请参见此处:(由于语法使用了SQL中的基本思想,因此对我来说很容易使用)。我理解@PeterButkovic。但我的情况是过滤器是动态的。因此,我无法硬编码查询。因此,如果用户希望按类过滤,我会添加params.add(criteriaBuilder.equal(root.get(“classId”),classId));classId没有问题,因为它是学生实体本身的一个属性。当用户希望按courseName进行筛选时会出现问题,我必须通过相关的集合实体进行筛选。Student是由生成的类。关于您得到的错误,它会显示OfferDetails和OfferDestinationMapping:这些类是您项目的吗?您忘了什么吗?根据编辑您的问题是的,这些是项目的详细信息。SetJoin courses=root.join(“课程”);给我错误,类型不匹配:无法从join转换为SetJoin这是在我更改为“CriteriaQuery criteria=criteriaBuilder.createQuery(Student.class);“SetJoin courses=root.join”之后(学生课程);我无法使用此选项,结尾带下划线的学生未被识别。我是否应该为此添加任何库?SetJoin courses=root.join(“课程”);正在工作…谢谢perissf。U还将研究元模型生成器。:)我已经编辑了我的答案。在添加更多评论之前,请仔细阅读我提到的3个链接。
SetJoin<Student, Course> courses = root.join(Student_.courses);
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[] {}));