Как написать подзапрос, используя критерии - PullRequest
0 голосов
/ 06 марта 2020

, пожалуйста, помогите мне написать построитель критериев для этого запроса

SELECT * 
FROM XYZ 
WHERE date_v < "2020/01" AND 
      id NOT IN (SELECT id FROM XYZ WHERE date_v = '2020/01')

Я смотрел на , используя подзапросы в критериях jpa api , но я не могу понять это

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

Ответы [ 3 ]

3 голосов
/ 06 марта 2020

Вы должны создать XyzEntity с полями Long id и LocalDate date_v.

// query
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<XyzEntity> query = cb.createQuery(XyzEntity.class);
Root<XyzEntity> root = query.from(XyzEntity.class);

LocalDate date = LocalDate.of(2020, 1, 1);

// subquery
Subquery<Long> subQuery = query.subquery(Long.class);
Root<XyzEntity> subRoot = subQuery.from(XyzEntity.class);
Predicate idSubPredicate = cb.equal(root.get("id"), subRoot.get("id"));
Predicate dateSubPredicate = cb.equal(subRoot.get("date_v"), date);

subQuery.select(subRoot.get("id")).where(idSubPredicate, dateSubPredicate);

// query predicates
Predicate datePredicate = cb.greaterThan(root.get("date_v"), date);
Predicate notExistsPredicate = cb.exists(subQuery).not();

// query result
query.select(root).where(datePredicate, notExistsPredicate);

List<XyzEntity> result = entityManager.createQuery(query).getResultList();
0 голосов
/ 13 марта 2020

Я упомянул исправления в комментариях к ответу, но я чувствую, что все решения кажутся хорошими и помогают другим. вот почему отвечаю.

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Entity> query = cb.createQuery(Entity.class);
    Root<Entity> root = query.from(Entity.class);
    // subquery
    Subquery<Long> subQuery = query.subquery(Long.class);
    Root<Entity> subRoot = subQuery.from(Entity.class);
    Predicate subPredicate = cb.equal(subRoot.get("date_v"), dateValue);

    subQuery.select(subRoot.get("id")).where(subPredicate);

    // query predicates
    Predicate datePredicate = cb.lessThan(root.get("date_v"), dateValue);
    Predicate notExistsPredicate = root.get("id").in(subQuery).not();

    // query result
    query.select(root).where(datePredicate, notExistsPredicate);
    Query d = entityManager.createQuery(query);
    List<Entity> resultList = d.getResultList()
0 голосов
/ 06 марта 2020

Попробуйте это:

SELECT * 
FROM XYZ 
WHERE date_v < '2020/01/01' AND 
      id NOT IN (SELECT id FROM XYZ WHERE date_v = '2020/01/01')
...