JPA-запрос с подвыбором - PullRequest
       1

JPA-запрос с подвыбором

0 голосов
/ 25 октября 2019

Я хотел бы выразить следующий запрос

select * from(
            select pI, max(pAs) as pAs from mytable
            and pAs>=?1 and pAs<=?2
            and pI like 'DE%%'
            and pE like ?6
            group by pI
            ) as x
            inner join mytable as a
            on a.pI=x.pI
            and a.pAs=x.pAs

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

Однако суть вопроса (который я не смог решить) заключается в том, что мне нужно два свойства, возвращенные в подвыбор. Все примеры, которые я нашел, возвращают только одно свойство.

Это действительно ограничение jpa / hibernate или есть способ сделать то, что я хочу? Любая помощь / указатели приветствуются.

1 Ответ

0 голосов
/ 28 октября 2019

Вы не предоставили никакой информации о вашей организации. Поэтому я подозреваю, что у вас есть Mytable класс сущностей, и у него есть Long поле pAs

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Mytable> query = builder.createQuery(Mytable.class);
Root<Mytable> root = query.from(Mytable.class);

Subquery<Long> subquery = query.subquery(Long.class); // max(pAs)
Root<Mytable> subRoot = subquery.from(Mytable.class);

Predicate predicate1 = 
         builder.equal(root.get("pI"), subRoot.get("pI"));

Predicate predicate2 = 
         builder.greaterThan(subRoot.get("pAs"), 0);

Predicate predicate3 = 
         builder.lessThan(subRoot.get("pAs"), 100);

//There is a simple example. But you can add as many predicates as you need
Predicate fullPredicate = 
         builder.and(predicate1, predicate2, predicate3);

Predicate havingPredicate = 
         builder.equal(root.get("pAs"), builder.max(subRoot.get("pAs")));

subquery.select(builder.max(subRoot.get("pAs"))).where(fullPredicate)
    .groupBy(subRoot.get("pI")).having(havingPredicate);

query.select(root).where(builder.exists(subquery));

List<Mytable> result = entityManager.createQuery(query).getResultList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...