Использование @ElementCollection в CriteriaQuery (или запрос содержимого @ElementCollection)

public enum ReportStatus { 
    SUCCCEED, FAILED;
}

public class Work {
    @ElementCollection
    @Enumerated(EnumType.STRING)
    List<ReportStatus> reportStatuses;
}

Учитывая следующую структуру, я хотел бы выполнить запрос, чтобы найти всю работу, отфильтрованную по reportStatuses. Он отлично работает со следующим синтаксисом hql:

public List<Long> queryHQL() {
    final String query = "SELECT w.id FROM Work w JOIN w.reportStatuses s WHERE s in (:rs)";

    final List<ReportStatus> reportStatuses = new ArrayList<ReportStatus>();
    reportStatuses.add(ReportStatus.FAILED);

    return this.entityManager.createQuery(query).setParameter("rs", reportStatuses).getResultList();
}

Но я хотел бы использовать API критериев (jpa2) и не могу понять, как это сделать. Вот моя самая близкая попытка, я думаю:

public List<Long> query() {
    final List<ReportStatus> reportStatuses = new ArrayList<ReportStatus>();
    reportStatuses.add(ReportStatus.FAILED);

    final CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();

    final CriteriaQuery<Long> criteriaQuery = builder.createQuery(Long.class);
    final Root<Work> workModel = criteriaQuery.from(Work.class);

    final ListJoin<Work, ReportStatus> status = workModel.joinList("reportStatuses");

    final Predicate predicate = status.in(reportStatuses);

    criteriaQuery.where(predicate);
    criteriaQuery.select(workModel.<Long> get("id"));

    return this.entityManager.createQuery(criteriaQuery).getResultList();
}

Я также пробовал использовать API критериев гибернации, но в качестве jpa2 мне не удалось найти правильный синтаксис.

6
задан le-doude 28 February 2014 в 02:51
поделиться