来自多个实体的 JPA CriteriaQuery 多选
JPA CriteriaQuery multiselect from several entities
现在,我正在使用 CriteriaQuery 的多选方法将实体 Termine 中的一些值放入实体任务中,如下所示:
CriteriaBuilder builder = getEm().getCriteriaBuilder();
CriteriaQuery<Task> taskCriteria = builder.createQuery(Task.class);
Root<Termin> terminRoot = taskCriteria.from(Termin.class);
taskCriteria.multiselect(terminRoot.get("text"), terminRoot.get("empfaenger"), terminRoot.get("datVon"));
taskCriteria.where(builder.equal(terminRoot.get("empfaenger"), "000"));
List<Task> task = getEm().createQuery(taskCriteria).getResultList();
return task;
这工作正常,但现在我愿意不仅从实体 Termine 还从实体 Aufgabe 收集值文本、empfaenger 和 datVon,这样我就会有一个任务列表,其中包含每个Termin 和 Aufgabe 拥有相同的 empfaenger。
可能吗?如果是,如何?
非常感谢您的帮助!
我会 类 来自任务。
@Entity(name="Task")
@Inheritance(strategy = InheritanceType.JOINED)
@NamedQuery(name="Task.findAll", query="SELECT t FROM Task t")
public class Task {
@Id
Long id;
String text;
String empfaenger;
}
@Entity
public class Termin extends Task{
...
}
@Entity
public class Aufgabe extends Task{
...
}
并且 select 他们使用命名查询
List<Task> resultList = entityManager.createNamedQuery("Task.findAll",Task.class).getResultList();
或以任务为根的条件查询。
这是我从多个实体收集数据的方式(自定义Select)。
例如,多个实体:
Root<InflowEntity> rootInflow = criteriaQuery.from(InflowEntity.class);
Root<OutflowEntity> rootOutflow = criteriaQuery.from(OutflowEntity.class);
你select你需要的属性来自上面2:
criteriaQuery.multiselect(rootInflow.get("inflowID"), rootInflow.get("name"),
rootOutflow.get("count"), rootOutflow.get("dateRange"));
添加你需要的谓词(约束),例如:
Predicate[] predicates = new Predicate[2];
predicates[0] = criteriaBuilder.equal(rootInflow.get("uuid"), loginContext.getUuid());
predicates[1] = criteriaBuilder.equal(rootOutflow.get("uuid"), loginContext.getUuid());
处理结果:
criteriaQuery.where(predicates);
List<ResultsBean> results = session.createQuery(criteriaQuery).getResultList();
这个 Java bean(这不是 Hibernate 实体),ResultsBean,存储结果。也就是说,它需要有一个构造函数来容纳输入 multiselect 的排列方式。
现在,我正在使用 CriteriaQuery 的多选方法将实体 Termine 中的一些值放入实体任务中,如下所示:
CriteriaBuilder builder = getEm().getCriteriaBuilder();
CriteriaQuery<Task> taskCriteria = builder.createQuery(Task.class);
Root<Termin> terminRoot = taskCriteria.from(Termin.class);
taskCriteria.multiselect(terminRoot.get("text"), terminRoot.get("empfaenger"), terminRoot.get("datVon"));
taskCriteria.where(builder.equal(terminRoot.get("empfaenger"), "000"));
List<Task> task = getEm().createQuery(taskCriteria).getResultList();
return task;
这工作正常,但现在我愿意不仅从实体 Termine 还从实体 Aufgabe 收集值文本、empfaenger 和 datVon,这样我就会有一个任务列表,其中包含每个Termin 和 Aufgabe 拥有相同的 empfaenger。
可能吗?如果是,如何?
非常感谢您的帮助!
我会 类 来自任务。
@Entity(name="Task")
@Inheritance(strategy = InheritanceType.JOINED)
@NamedQuery(name="Task.findAll", query="SELECT t FROM Task t")
public class Task {
@Id
Long id;
String text;
String empfaenger;
}
@Entity
public class Termin extends Task{
...
}
@Entity
public class Aufgabe extends Task{
...
}
并且 select 他们使用命名查询
List<Task> resultList = entityManager.createNamedQuery("Task.findAll",Task.class).getResultList();
或以任务为根的条件查询。
这是我从多个实体收集数据的方式(自定义Select)。 例如,多个实体:
Root<InflowEntity> rootInflow = criteriaQuery.from(InflowEntity.class);
Root<OutflowEntity> rootOutflow = criteriaQuery.from(OutflowEntity.class);
你select你需要的属性来自上面2:
criteriaQuery.multiselect(rootInflow.get("inflowID"), rootInflow.get("name"),
rootOutflow.get("count"), rootOutflow.get("dateRange"));
添加你需要的谓词(约束),例如:
Predicate[] predicates = new Predicate[2];
predicates[0] = criteriaBuilder.equal(rootInflow.get("uuid"), loginContext.getUuid());
predicates[1] = criteriaBuilder.equal(rootOutflow.get("uuid"), loginContext.getUuid());
处理结果:
criteriaQuery.where(predicates);
List<ResultsBean> results = session.createQuery(criteriaQuery).getResultList();
这个 Java bean(这不是 Hibernate 实体),ResultsBean,存储结果。也就是说,它需要有一个构造函数来容纳输入 multiselect 的排列方式。