2016-05-25 2 views
0

У меня проблема с подзапросом с JPQL, такая же ошибка возникает с критериями. Запрос возвращает ошибку синтаксиса:Ошибка синтаксиса подзапроса JPA

Encountered "," javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not prepare statement. 

JPQL

StringBuilder query = new StringBuilder("SELECT d FROM Document d WHERE NOT EXISTS (SELECT ds FROM Documents ds WHERE d = ds.key.document)"); 
TypedQuery<Documento> tQuery = entityManager.createQuery(query.toString()); 
List<Document> documents = tQuery.getResultList(); 

Критерии

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<Document> query = cb.createQuery(Document.class); 

    Root<Document> root = query.from(Document.class); 
    CriteriaQuery<Document> select = query.select(root); 

    Subquery<Documents> sQuery = query.subquery(Documents.class); 
    Root<Documents> rootSubquery = sQuery.from(Documents.class); 
    Predicate p = cb.equal(rootSubquery.get("key").get("document"), root); 
    sQuery.select(rootSubquery); 
    sQuery.where(p); 
    select.where(cb.not(cb.exists(sQuery))); 
    TypedQuery<Documento> tQuery = entityManager.createQuery(query); 
    List<Document> documents = tQuery.getResultList(); 
+0

вы пробовали с: ' StringBuilder query = new StringBuilder ("SELECT d FROM Document d WHERE NOT EXISTS (SELECT ds FROM Documents ds WHE RE d: ds.key.document) ");' Проверьте ':' вместо '=' – Dazak

ответ

1

запрос кажется правильным. Но слово KEY является зарезервированным словом в Дерби. Это должно быть причиной. Поэтому лучше переименуйте этот атрибут в объекте Documents.

0

Я не знаю, является ли это ошибкой или должно быть так, но имея составной ключ, я указал в столбцах подзапроса затронутый ключ, и он работает. Это происходит только в подзапросах в другом выборе я не встречал эту ошибку

изменения:

JPQL

StringBuilder query = new StringBuilder("SELECT d FROM Document d WHERE NOT EXISTS (SELECT ds.key.document FROM Documents ds WHERE ds.key.document = d)"); 

Критерии

... 
Subquery<Documents> sQuery = query.subquery(Documents.class); 
Root<Documents> rootSubquery = sQuery.from(Documents.class); 
Predicate p = cb.equal(rootSubquery.get("key").get("document"), root); 
sQuery.select(rootSubquery.get("key").get("document")); 
sQuery.where(p); 
select.where(cb.not(cb.exists(sQuery))); 
... 
Смежные вопросы