2016-02-11 63 views
1

有任何人知道如何PostgreSQL的查询JPA @Query,平均有限制元素的

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

转换为JPA查询与@Query注解?

现在我有一些混乱,但混乱的工作:

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查询不支持类似限制

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

+0

JPQL不提供指定子查询中行数限制的方法。 –

+0

以上我写了 “我读过JPA查询不支持类似限制的东西。” 但无论如何回复:) – solejnik

+0

JPA查询是否支持限制...只是不在SUBQUERY ...正如我上面写的 –

回答

-1

这可能有助于您使用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