JPA @Query,平均

时间:2016-02-11 19:58:36

标签: java hibernate postgresql jpa

有人知道如何转换postgresql查询

select avg(stock.price) from stock where (stock.name = 'some_name' and stock.date in (select stock.date from stock where stock.name = 'some_name' limit 10))

使用@Query注释进行JPA查询?

现在我有些混乱,但工作一塌糊涂:

public Double countStocksAvgToDateAndDaysAmount(String stockName, String date, Integer days) {
        List<StockEntity> stocksByNameTillDate = stockRepository.getStocksByNameTillDates(stockName,
                java.sql.Date.valueOf(date));
        Integer countDays = 0;
        Double sum = 0.0;
        Double avg = 0.0;
        for (StockEntity stock : stocksByNameTillDate) {
            countDays++;
            sum += stock.getPrice();
            if (countDays >= days) {
                break;
            }
        }
        avg = sum / countDays;
        return avg;
    }

函数 stockRepository.getStocksByNameTillDates()使用@Query

 @Query("select stock from StockEntity stock where ((stock.name like :name) and (stock.date <= :date))")
    public List<StockEntity> getStocksByNameTillDates(@Param("name") String name,@Param("date") Date date);

我认为这有点(或者更糟,不止一点)次优。 我读到JPA查询不支持 limit

有人知道如何改进或使这些代码更优化吗?我的意思是JPA为我而不是这个类做这个的方式,而不是使我的java代码更优化。

1 个答案:

答案 0 :(得分:-2)

这可能有助于您使用jpa查询获取10行。

String hql = "SELECT avg(stock.price) from Stock stock where (stock.name = :stockName and stock.date in (select stock.date from stock where stock.name = :stockName))";
Query query = session.createQuery(hql);
query.setParameter("stockName", "stockName");
List results = query.list();

// If you want to fetch only 10 rows then
query.setMaxResults(10); //it takes only an integer parameter