У меня 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) в моей базе данных, что неверно.
Пожалуйста, дайте мне немного света. Вопросов:
В настоящее время вы просто передаете литерал. Это не то же самое, что параметр. См. 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, и он отлично работает. В любом случае спасибо за вашу помощь.
это будет легко понять, если вы представите данные в табличной форме.