代码之家  ›  专栏  ›  技术社区  ›  Olahzzz

带有联接和动态参数的JPA标准生成器

  •  0
  • Olahzzz  · 技术社区  · 7 年前

    我有两门课,一对多的关系。 客户(类)有许多事务(类)

     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. 我的问题是什么?为什么它总是得到第一个记录?
    1 回复  |  直到 7 年前
        1
  •  0
  •   user3973283    7 年前

    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();