Конструктор критериев JPA с объединением и динамическими параметрами

У меня 2 класса с отношением "один ко многим". Клиент (класс) имеет много транзакций (класс)

 public class Customer {
     @Id
     private Long clientId;
     private String name;
     @OneToMany
     private List<Transactions> transactions;

}

 public class Transactions {
  @JoinColumn(name = "clientId")
  private Transactions transactions;
  private int statusType;
  private String amount;
}




 int dynamicValue = 1003;
 CriteriaQuery<Customer> criteriaQuery = getBuilder().createQuery(Customer.class);
    Root<Customer> customersRoot = criteriaQuery.from(Customer.class);
    Join<Customer, Transactions> transactions = customersRoot.join("transactions");

    TypedQuery<Customer> query = em.createQuery(criteriaQuery.select(customerRoot).where(getBuilder().equal(transactions.get("statusType"), dynamicValue)));
    List<Customer> customerList = (List<Customer>) query.getResultList();

У меня есть 2 данных из БД: Таблица клиентов

ClientId   | Name         | 
1          | James        |
2          | Eli          | 

Таблица транзакций:

  ClientId     | Status Type| Amount| TransactionId |
    1          | 1002       | 100   | 1             |
    1          | 1003       | 200   | 2             |

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

Пожалуйста, дайте мне немного света. Вопросов:

  1. Как я могу добиться наличия нескольких динамических параметров в построителе критериев?
  2. Что не так с моим запросом, почему он всегда получает первую запись?

это будет легко понять, если вы представите данные в табличной форме.

Ravi 04.09.2018 05:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
1 940
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В настоящее время вы просто передаете литерал. Это не то же самое, что параметр. См. http://www.datanucleus.org:15080/products/accessplatform_5_2/jpa/query.html#_criteria_api_parameters

Измените свой код на

CriteriaQuery<Customer> criteriaQuery = getBuilder().createQuery(Customer.class);
    Root<Customer> customersRoot = criteriaQuery.from(Customer.class);
    Join<Customer, Transactions> transactions = customersRoot.join("transactions");

ParameterExpression param = getBuilder().parameter(int.class, "myParam");
TypedQuery<Customer> query = em.createQuery(criteriaQuery.select(customerRoot).where(getBuilder().equal(transactions.get("statusType"), param)));

// Execute with first parameter value
query.setParameter("myParam", 1003);
List<Customer> customerList = (List<Customer>) query.getResultList();

Затем, если у вас возникнут проблемы с результатом, вы посмотрите в журнале поставщиков JPA на SQL, который был выполнен, и сможете лучше понять проблему.

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

Yejin 05.09.2018 08:51

Другие вопросы по теме