JPA 2.0, API критериев, подзапросы, выражения

Я попытался написать инструкцию запроса с подзапросом и выражением IN много раз. Но я никогда не преуспевал.

Я всегда получаю исключение: «Ошибка синтаксиса рядом с ключевым словом« IN », заявление запроса было построено следующим образом:

 SELECT t0.ID, t0.NAME FROM EMPLOYEE t0 WHERE IN (SELECT ? FROM PROJECT t2, EMPLOYEE t1 WHERE ((t2.NAME = ?) AND (t1.ID = t2.project))) 

Я знаю слово до того, как «IN» проиграет.

Вы когда-нибудь писали такой запрос? Любое предложение?

    Ниже приведен псевдокод для использования подзапроса с использованием API критериев.

     CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(); Root from = criteriaQuery.from(EMPLOYEE.class); Path path = from.get("compare_field"); // field to map with sub-query from.fetch("name"); from.fetch("id"); CriteriaQuery select = criteriaQuery.select(from); Subquery subquery = criteriaQuery.subquery(PROJECT.class); Root fromProject = subquery.from(PROJECT.class); subquery.select(fromProject.get("requiredColumnName")); // field to map with main-query subquery.where(criteriaBuilder.and(criteriaBuilder.equal("name",name_value),criteriaBuilder.equal("id",id_value))); select.where(criteriaBuilder.in(path).value(subquery)); TypedQuery typedQuery = entityManager.createQuery(select); List resultList = typedQuery.getResultList(); 

    Также он определенно нуждается в некоторой модификации, поскольку я попытался отобразить ее в соответствии с вашим запросом. Вот ссылка http://www.ibm.com/developerworks/java/library/j-typesafejpa/, которая прекрасно объясняет концепцию.

    Позднее воскресение.

    Ваш запрос кажется очень похожим на тот, который приведен на стр. 259 книги Pro JPA 2: Освоение Java Persistence API , которое в JPQL читает:

     SELECT e FROM Employee e WHERE e IN (SELECT emp FROM Project p JOIN p.employees emp WHERE p.name = :project) 

    Используя базу данных EclipseLink + H2, я не мог получить ни JPQL книги, ни соответствующие критерии. Для этой конкретной проблемы я обнаружил, что если вы ссылаетесь на идентификатор напрямую, а не на то, чтобы поставщик постоянства определял это, все работает так, как ожидалось:

     SELECT e FROM Employee e WHERE e.id IN (SELECT emp.id FROM Project p JOIN p.employees emp WHERE p.name = :project) 

    Наконец, чтобы ответить на ваш вопрос, здесь приведен пример эквивалентного строго типизированного критерия:

     CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery c = cb.createQuery(Employee.class); Root emp = c.from(Employee.class); Subquery sq = c.subquery(Integer.class); Root project = sq.from(Project.class); Join sqEmp = project.join(Project_.employees); sq.select(sqEmp.get(Employee_.id)).where( cb.equal(project.get(Project_.name), cb.parameter(String.class, "project"))); c.select(emp).where( cb.in(emp.get(Employee_.id)).value(sq)); TypedQuery q = em.createQuery(c); q.setParameter("project", projectName); // projectName is a String List employees = q.getResultList(); 
    Interesting Posts

    Как обмениваться файлами / папками в Sun VirtualBox?

    Как создать zip / tgz в Linux, чтобы у Windows были правильные имена файлов?

    Прикрепление кода к началу и концу сеанса в Linux

    В powerpoint, как я могу получить значок пули в текстовом поле, чтобы использовать тот же значок, что и в поле «Нажмите здесь»?

    Как отключить * автоматическую перезагрузку в Windows 10?

    page.DataContext не унаследован от родительского фрейма?

    Лицензирование Windows 7 – Старый компьютер для нового

    #pragma pack effect

    Пользовательский WCF DataContractSerializer

    Удерживание кнопки питания на ПК при отключении от питания

    Как поместить отдельные метки для участка рассеяния

    Как я могу вызвать функцию xll addin из vba?

    разница между http.context.user и thread.currentprincipal и когда их использовать?

    Как узнать файлы «.automaticDestinations-ms», к которым относится приложение?

    Проверка файла XML с использованием нескольких схемных определений

    Давайте будем гением компьютера.