how to write subquery using criteria

var a :

please help me out writing criteria builder for this query

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

i have looked at using subqueries in jpa criteria api but i am unable to figure it

I have tried using subquery and joins but it throwing different error after all i get to know that i need to get more clarity about query criteria usages. any help much appreciated

alex valuiskyi :

You have to create XyzEntity with Long id and LocalDate date_v fields.

//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 subPredicate = cb.equal(subRoot.get("date_v"), date);

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

// 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();

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=28313&siteId=1