具有连接和动态参数的 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),这是不正确的。

请给我一点光。 问题:

  1. 如何在条件生成器中实现多个动态参数?
  2. 我的查询有什么问题为什么总是得到第一条记录?

您目前只是在传递文字。这与参数不同。参见 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 提供程序日志,这样可以更好地理解问题所在