Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有结果整数的CriteriaBuilder联接/子查询_Java_Jpa_Criteria Api - Fatal编程技术网

Java 具有结果整数的CriteriaBuilder联接/子查询

Java 具有结果整数的CriteriaBuilder联接/子查询,java,jpa,criteria-api,Java,Jpa,Criteria Api,我正在尝试使用CriteriaBuilder创建一个查询,以选择库存大于零的所有产品。库存为sumDeliveryRow.amount-sumDispatchRow.amount。当然,两者都只包含正确的产品 我曾尝试为DeliveryRow和DispatchRow创建子查询,但我觉得这应该使用联接来完成 班级 质疑 在这个查询中,我不确定如何处理xxx。我尝试过创建子查询,但没有成功 CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQ

我正在尝试使用CriteriaBuilder创建一个查询,以选择库存大于零的所有产品。库存为sumDeliveryRow.amount-sumDispatchRow.amount。当然,两者都只包含正确的产品

我曾尝试为DeliveryRow和DispatchRow创建子查询,但我觉得这应该使用联接来完成

班级

质疑

在这个查询中,我不确定如何处理xxx。我尝试过创建子查询,但没有成功

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Product> query = cb.createQuery(Product.class);
Root product = query.from(Product.class);
query.select(product);

// sum of DeliveryRow.amount where DeliveryRow.product = Product
// minus 
// sum of DispatchRow.amount where DispatchRow.product = Product
Expression stock = xxx;  

query.where(cb.gt(stock, Integer.parseInt(0)));
return em.createQuery(query).getResultList();

关于如何解决这个问题有什么建议吗?

我最近一直在研究JPA/JPQL,研究三种不同的实体检索方法:NamedQueries、em.CreateQuery和CriteriaBuilder。在我看来,标准构建器是三个标准中最难使用的。我建议创建一个NamedQuery来处理这种情况,它将更易于实现和阅读

使用此JPQL表达式,您可以检索库存大于零的所有产品:

SELECT p.name, SUM(delRow.amount) - SUM(disRow.amount) 
FROM Product p join p.deliveryRows delRow join p.dispatchRows disRow
HAVING SUM(delRow.amount) - SUM(disRow.amount) > 0

/* This assumes product has a Collection<DispatchRow> named dispatchRows 
   and a Collection<DeliveryRow> named deliveryRows.
*/
然后使用EntityManager执行此查询


我知道这与使用CriteriaAPI是不同的方法,但我认为JPQL查询远远优于CriteriaAPI。与非常类似于SQL的JPQL语法相比,API感觉不那么简洁和直观。如果您决定采用这种方法,我已经创建了一个视频教程,演示@namedquerys,并演示如何强式键入包含投影的查询结果。可以找到它。

我最近一直在研究JPA/JPQL,研究三种不同的实体检索方法:NamedQueries、em.CreateQuery和CriteriaBuilder。在我看来,标准构建器是三个标准中最难使用的。我建议创建一个NamedQuery来处理这种情况,它将更易于实现和阅读

使用此JPQL表达式,您可以检索库存大于零的所有产品:

SELECT p.name, SUM(delRow.amount) - SUM(disRow.amount) 
FROM Product p join p.deliveryRows delRow join p.dispatchRows disRow
HAVING SUM(delRow.amount) - SUM(disRow.amount) > 0

/* This assumes product has a Collection<DispatchRow> named dispatchRows 
   and a Collection<DeliveryRow> named deliveryRows.
*/
然后使用EntityManager执行此查询


我知道这与使用CriteriaAPI是不同的方法,但我认为JPQL查询远远优于CriteriaAPI。与非常类似于SQL的JPQL语法相比,API感觉不那么简洁和直观。如果您决定采用这种方法,我已经创建了一个视频教程,演示@namedquerys,并演示如何强式键入包含投影的查询结果。可以找到它。

我以前使用过NamedQueries,虽然我使用CriteriaBuilder是因为类型安全,但你不担心吗?你对类型安全有什么担心,对象[]?不,查询是字符串。say DispatchRow上的任何更改都可能导致问题?@Aquillo因此查询包含对DispatchRow上的amount字段的一个引用。那么你是说如果这个列被保留或者它的类型被改变,它会破坏查询?这怎么可能不打破通过API建立的标准呢?您需要如何使用字段名称引用该字段并对其应用聚合函数,这将要求该类型为某种形式的数值。也许我遗漏了什么,你能详细说明一下吗?好吧,使用CriteriaBuilder和元模型,任何严肃的IDE在更改相关对象的任何字段时都会注意到错误。否则,它仍然会在编译时显示错误。NamedQueries不会吗?我以前使用过NamedQueries,尽管我使用CriteriaBuilder是因为类型安全,你不担心吗?你对类型安全有什么担心,对象[]?不,查询是字符串。say DispatchRow上的任何更改都可能导致问题?@Aquillo因此查询包含对DispatchRow上的amount字段的一个引用。那么你是说如果这个列被保留或者它的类型被改变,它会破坏查询?这怎么可能不打破通过API建立的标准呢?您需要如何使用字段名称引用该字段并对其应用聚合函数,这将要求该类型为某种形式的数值。也许我遗漏了什么,你能详细说明一下吗?好吧,使用CriteriaBuilder和元模型,任何严肃的IDE在更改相关对象的任何字段时都会注意到错误。否则,它仍然会在编译时显示错误。你不会吗?
//This should be concatenated or on one line
@NamedQuery(name="Product.hasStock" 
    query="SELECT p.name, SUM(delRow.amount) - SUM(disRow.amount) 
    FROM Product p join p.deliveryRows delRow join p.dispatchRows disRow
    HAVING SUM(delRow.amount) - SUM(disRow.amount) > 0");
@PersistenceContext
EntityManager em;

public void execute(){
  List<Object[]> products = 
      em.createNamedQuery("Product.hasStock").getResultList();

  /* Projections return a List<Object[]> where position 1 in the object array
     corresponds with the first field in the select statement, position two
     corresponds with the second field and so on...  These can also be strongly typed
     if an object is created and the constructor is specified in JPQL statement
  */
}