Как преобразовать запрос sql в критерии jpa для спящего или затмения - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть таблица с

Id      value 
1000    null
1000    En
1000    Fr
1000    Es
1001    En
1001    Fr
1001    Es

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

Id      value
1000    null
1001    En
1001    Fr
1001    Es

Я получил запрос на выборку, как показано ниже, из стека через поток ( Как задать предпочтение нулевому значению во время выбора ), как преобразовать тот же запрос в критерии jpa для ссылки в спящем режиме или затмения

select query 
SELECT t1.id,
       t1.value
       FROM elbat t1
       WHERE NOT EXISTS (SELECT *
                                FROM elbat t2
                                WHERE t2.id = t1.id
                                      AND t2.value IS NULL)
              OR t1.value IS NULL;

Предположим, что мой класс сущностей имеет класс Test {

private String id;

private String value;

}

1 Ответ

0 голосов
/ 10 февраля 2020

Это работает для меня

Список getTests () {

            final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
            final CriteriaQuery<Test> criteriaQuery = criteriaBuilder.createQuery(Test.class);

            Root<Test> TestRoot = criteriaQuery.from(Test.class);

            Subquery<Test> subquery = criteriaQuery.subquery(Test.class);

            Root<Test> subQueryTestRoot = subquery.from(Test.class);

            subquery.where(criteriaBuilder.and(subQueryTestRoot.get(Test_.value).isNull()), criteriaBuilder
                    .equal(TestRoot.get(Test_.id), subQueryTestRoot.get(Test_.id)));


            criteriaQuery.where(criteriaBuilder.or(TestRoot.get(Test_.value).isNull(), criteriaBuilder.not(criteriaBuilder.exists(subquery))));

            TypedQuery<Test> typedQuery = entityManager.createQuery(criteriaQuery);


            return typedQuery.getResultList();
        }
...