2016-11-01 3 views
0

У меня есть отображение JPA с oneToMany, теперь я хочу, чтобы выбрать эту коллекцию с CriteriaQuery, так же, какJPA2 список выбора из сущности

query.select(Root_.collection).where(cb.equal(root.id, id)) 
List<ResultObject> results = em.createQuery(query).getResultList(); 

Я не могу себе представить, что это не возможно. .. Потому что из репозитория тоже можно ...

Вариант использования для этого состоит в том, чтобы поместить результат нескольких запросов в DTO.

Thnx!

+0

Каков результат выполнения этого фрагмента кода? Первое, что приходит на ум, - это «FetchType». Вы установили для fetchtype для коллекции OneToMany 'Eager'? –

+0

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

ответ

0

Использование коллекций в выбора пункта не допускается и поэтому этот query.select (Root_.collection) не работает в Criteria API.

Вы можете сделать это, хотя и не рекомендуется подход (http://www.kumaranuj.com/2013/07/jpa-2-fetch-joins-and-whether-we-should.html):

root.fetch(Root_.collection); 
    query.select(root).distinct(true).where(cb.equal(root.get("id"), id)); 

Тогда из сказанного выше, в зависимости от количества различных строк Root возвращаемые, теперь вы можете получить доступ к коллекции для oneToMany отношений в корне, как показано ниже:

final Root result = em.createQuery(query).getSingleResult(); //Since we are getting results using primary key and distinct, we then use getSingleResult 
    final Collection rootCollection = result.getCollection(); 

Ключевые моменты здесь в использовании root.fetch (Root_.collection) и select (root) .distinct (true).