Java 复杂条件查询:使用JPA而不是NativeQuery

Java 复杂条件查询:使用JPA而不是NativeQuery,java,mysql,jpa,nativequery,criteriaquery,Java,Mysql,Jpa,Nativequery,Criteriaquery,在我的Java EE项目中,我有一个针对MySQL的NativeQuery: SELECT *, ROUND((price_2-price_1)*100/price_1,2) AS varprice_1, ROUND((quantity_2-quantity_1)*100/quantity_1,2) AS varcant_1, ROUND((price_3-price_2)*100/price_2,2) AS varprice_2, ROUND((qua

在我的Java EE项目中,我有一个针对MySQL的NativeQuery:

SELECT 
    *,
    ROUND((price_2-price_1)*100/price_1,2) AS varprice_1,
    ROUND((quantity_2-quantity_1)*100/quantity_1,2) AS varcant_1,
    ROUND((price_3-price_2)*100/price_2,2) AS varprice_2,
    ROUND((quantity_3-quantity_2)*100/quantity_2,2) AS varcant_2,
    1 
FROM ( 
    SELECT   
        c.id_customer AS id_customer, 
        c.name AS customer,   
        r.id_rep AS id_rep, 
        r.descr AS rep,   
        a.id_article AS id_article, 
        a.name AS article, 
        ROUND(SUM(if(docdate BETWEEN '2013-06-30' AND '2013-12-30',quantity ,0)),2) AS quantity_1,
        ROUND(SUM(if(docdate BETWEEN '2013-06-30' AND '2013-12-30',net_price,0)),2) AS price_1,
        ROUND(SUM(if(docdate BETWEEN '2012-06-30' AND '2012-12-30',quantity ,0)),2) AS quantity_2,
        ROUND(SUM(if(docdate BETWEEN '2012-06-30' AND '2012-12-30',net_price,0)),2) AS price_2,
        ROUND(SUM(if(docdate BETWEEN '2011-06-30' AND '2011-12-30',quantity ,0)),2) AS quantity_3,
        ROUND(SUM(if(docdate BETWEEN '2011-06-30' AND '2011-12-30',net_price,0)),2) AS price_3, 
        1 
    FROM documento d 
    RIGHT JOIN pedido_cabezal pc ON d.id_documento = pc.id_documento 
    LEFT JOIN pedido_linea pl ON pc.id_documento = pl.id_documento 
    LEFT JOIN article a ON pl.id_article = a.id_article 
    LEFT JOIN customer c ON pc.id_customer=c.id_customer 
    LEFT JOIN rep r ON c.id_rep=r.id_rep 
    WHERE ( 
        (docdate BETWEEN '2013-06-30' AND '2013-12-30') OR
        (docdate BETWEEN '2012-06-30' AND '2012-12-30') OR  
        (docdate BETWEEN '2011-06-30' AND '2012-12-30')  
        )  
    GROUP BY a.id_article  
) subq 
ORDER BY price_1 DESC
这是一个动态生成的查询,取决于用户输入。我不喜欢使用本机查询,所以我现在正在使用它,我计划用一个条件查询来更改它,但我需要帮助:我不知道如何用条件查询来代替这种查询。在这样的情况下,有没有一种方法或者可以使用本机查询,我应该不再担心它


谢谢

不幸的是,您不能在from子句中使用JPA子查询结果。既不在条件查询中,也不在JPQL查询中。这似乎是将查询转换为JPA查询时的最大问题

其次,也没有
Round
函数。但是,通过使用

另见:

谢谢。那么,您如何看待对这类事情使用本机查询的必要性呢?我这样问是因为我注意到,显然原生查询比jpql查询更快,占用的内存更少,所以我在想,对于统计目的或繁重的计算,使用原生查询是否普遍可以接受。在特定情况下,使用原生查询是必要的。如果您喜欢可移植性和易维护性,最好避免。如果要汇总的项目数量不大,例如,您可以在JPA条件查询中检索这些项目,并使用java对它们进行汇总。或者如果项目的数量很大,则可以考虑将总数保存在数据库表中。