Hibernate:属性值列表中的外连接

时间:2016-02-05 09:30:49

标签: hibernate join outer-join

我有一个像:

这样的实体
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中甚至可以选择这样的选择吗?我只发现了与其他实体的外连接的文章。我可以使用我的条件列表创建临时虚拟表并对它们进行外部联接吗?或者其他一些方式?

1 个答案:

答案 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();