public enum ReportStatus {
SUCCCEED, FAILED;
}
public class Work {
@ElementCollection
@Enumerated(EnumType.STRING)
List<ReportStatus> reportStatuses;
}
Учитывая такую структуру, я хотел бы выполнить запрос, чтобы найти всю работу отфильтрованной reportStatuses. Он отлично работает со следующим HQL синтаксисом:Использование @ElementCollection в CriteriaQuery (или Запрашивание над содержанием в @ElementCollection)
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();
}
Я также попытался с критериями Hibernate API, но как jpa2 один я не смог найти правильный синтаксис.
ël проверить обновленный ответ. – dira