我有一个像:
这样的实体public class CountEntry
{
String company;
String product;
Date day;
Integer stock;
}
现在我需要一个查询,它将返回公司,产品和日期列表的所有可能组合,即使表格上还没有条目。
我无法进行外部联接,因为公司和产品不是数据库实体。即使他们是,我仍然需要一个解决方案来获得每天的价值。
例如:如果我查询:
公司在C1,C2中 P1,P2中的产品 2月10日至2月11日之间的一天
并且该表仅包含
C1,P1,2月10日,股票= 20
C1,P2,2月10日,股票= 5
C1,P2,2月11日,股票= 6
C2,P2,2月11日,股票= 1
我希望查询返回我的标准的完整笛卡尔积(我们使用投影列表和对象数组进行快速处理):
C1,P1,2月10日,股票= 20
C1,P1,2月11日,股票= null
C1,P2,2月10日,股票= 5
C1,P2,2月11日,股票= 6
C2,P1,2月10日,股票= null
C2,P1,2月11日,股票= null
C2,P2,2月10日,股票= null
C2,P2,2月11日,股票= 1
我们选择这种方法来解决性能问题,因为我们所做的查询可以返回大量数据,因此我们不希望查询返回实体对象(我们以后需要对象数组)。我们当前的后处理依赖于获取输入查询列表的笛卡尔积。
在Hibernate中甚至可以选择这样的选择吗?我只发现了与其他实体的外连接的文章。我可以使用我的条件列表创建临时虚拟表并对它们进行外部联接吗?或者其他一些方式?
答案 0 :(得分:0)
所以你要聚合的东西是列而不是其他表的FK。 这很简单,因为您只需按查询分组:
Object[] result = entityManager.createQuery(
"select " +
" count(c), " +
" c.company, " +
" c.product, " +
" c.day " +
"from CountEntry c " +
"group by c.company, c.product, c.day", Object[].class )
.getSingleResult();