首页 > 解决方案 > 具有连接和动态参数的 JPA Criteria Builder

问题描述

我有 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             |

我需要在上面进行查询以接受多个参数(动态)。这些参数将来自客户的属性,例如名称,一些参数将来自 Transactions 类。但是,当我尝试执行上面的代码时,它总是在我的数据库中获得第一条记录(1002),这是不正确的。

请给我一点光。问题:

  1. 如何在标准构建器中实现多个动态参数?
  2. 我的查询有什么问题,为什么它总是获得第一条记录?

标签: javajpapersistencecriteria-api

解决方案


你目前只是传递一个文字。这与参数不同。见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,并且可以更好地理解问题


推荐阅读