JPA 2, запрос критериев соединения без сопоставления сущностей - PullRequest
2 голосов
/ 10 июля 2020

У меня есть следующие таблицы:

  • клиенты

  • заказы

      @Entity
      public class Customer {
    
          String id;
    
      }
    
      @Entity
      public class Order {
    
          String id;
          String customerId;
    
      }
    

Мне не нужно устанавливать sh отображение сущности между ними; однако мне нужен запрос, который должен объединить эти две таблицы:

    final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    final CriteriaQuery<Customer> criteriaQuery = criteriaBuilder.createQuery(Customer.class);
    final Root<Customer> root = criteriaQuery.from(Customer.class);
    final Join<Order, Customer> joinOrder = root.join(Order_.customerId.getName()); // doesn't work

    final TypedQuery<Customer> queryData = entityManager.createQuery(
            criteriaQuery
                    .where(
                            criteriaBuilder.lessThan(root.get(Customer_.creationDate), date)
                            // should add a predicate with order properties
                    )
    );


    return queryData.getResultList();

Можно ли сделать что-то подобное с JPA 2?

1 Ответ

1 голос
/ 10 июля 2020
  • Вы можете использовать подзапрос
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Customer> customerQuery = 
                                      cb.createQuery(Customer.class);
    Root<Customer> customerRoot = customerQuery.from(Customer.class);

    Subquery<Order> subQuery = customerQuery.subquery(Order.class);
    Root<Order> orderRoot = subQuery.from(Order.class);

    //Replace this with the restriction you want to apply to order
    Predicate predicate= orderRoot.get("xxxxx").in(xxx, xxx);

    subQuery.select(orderRoot.get("customerId")).where(predicate);

    customerQuery.select(customerRoot).where(customerRoot.get("id").in(subQuery));
    em.createQuery(issueQuery).getResultList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...