具有连接和动态参数的 JPA Criteria Builder
JPA Criteria Builder with join and dynamic parameters
我有 2 个 class 具有一对多关系。
客户 (class) 有很多交易 (class)
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 个来自数据库的数据:
客户Table
ClientId | Name |
1 | James |
2 | Eli |
交易 Table:
ClientId | Status Type| Amount| TransactionId |
1 | 1002 | 100 | 1 |
1 | 1003 | 200 | 2 |
我需要在上面进行查询以接受多个参数(动态)。这些参数将来自客户的属性,例如姓名,一些参数将来自交易 class。但是,当我尝试执行上面的代码时,它总是在我的数据库中得到第一条记录 (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();
然后,如果结果有问题,您可以查看执行的 SQL 中的 JPA 提供程序日志,这样可以更好地理解问题所在
我有 2 个 class 具有一对多关系。 客户 (class) 有很多交易 (class)
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 个来自数据库的数据: 客户Table
ClientId | Name |
1 | James |
2 | Eli |
交易 Table:
ClientId | Status Type| Amount| TransactionId |
1 | 1002 | 100 | 1 |
1 | 1003 | 200 | 2 |
我需要在上面进行查询以接受多个参数(动态)。这些参数将来自客户的属性,例如姓名,一些参数将来自交易 class。但是,当我尝试执行上面的代码时,它总是在我的数据库中得到第一条记录 (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();
然后,如果结果有问题,您可以查看执行的 SQL 中的 JPA 提供程序日志,这样可以更好地理解问题所在