JPA CriteriaQuery множественный выбор из нескольких объектов

Прямо сейчас я использую метод multiselect CriteriaQuery, чтобы поместить некоторые значения из сущности Termine в сущность Task следующим образом:

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;

Это работает нормально, но теперь я хочу собрать текст значений, empfaenger и datVon не только из сущности Termine, но и из сущности Aufgabe, так что у меня будет список задач, который содержит каждый Termin и Aufgabe, которые имея такой же empfaenger.

Является ли это возможным? Если да, то как?

Заранее большое спасибо за вашу помощь!

1 ответ

Решение

Я бы вывел оба класса из задачи.

@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{
    ...
}

И выберите их с помощью именованного запроса

List<Task> resultList = entityManager.createNamedQuery("Task.findAll",Task.class).getResultList();

или запрос критерия с Задачей как Корнем.

Так я собирал данные из нескольких сущностей (настраиваемый выбор). Например, несколько сущностей:

Root<InflowEntity> rootInflow = criteriaQuery.from(InflowEntity.class);
Root<OutflowEntity> rootOutflow = criteriaQuery.from(OutflowEntity.class);

Вы выбираете нужные вам атрибуты из 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-компонент (это не объект Hibernate), ResultsBean, сохраняет результаты. То есть, у него должен быть конструктор, чтобы приспособить ввод так, как устроен множественный выбор.

Другие вопросы по тегам