【问题标题】:HQL - outer join on 2 conditionsHQL - 两个条件的外连接
【发布时间】:2011-11-17 08:10:14
【问题描述】:

我需要编写查询。这是一个简化的问题: 有命名的篮子。其中有水果(0个或更多)。篮子有所有者(1 个或多个)。水果也有所有者(1 个或多个)。我想在 Joe 的篮子中获取 Joe 的水果列表,包括 Joe 的篮子中没有任何 Joe 的水果。我们开始:

select basket.name, fruit.name from Owner owner
join owner.baskets basket
left outer join basket.fruits fruit WITH OWNER in (FRUIT.OWNERS)
where owner.id = joe_id

但是...它在 HQL 中不起作用。它只是看起来不错。 SQL 很简单。

所以,问题是: 如何在 HQL 或标准 API 中加入多个条件 (使用休眠 3.3)。

我需要分页,所以我以后无法取空篮子,因为我无法计算哪些项目应该在哪些页面上。我目前的解决方案是原生查询,但一定有办法……

【问题讨论】:

  • 来自休眠的实际错误消息在这里会很有帮助...
  • 我在任何地方都找不到示例堆栈跟踪,但它说这个查询是不正确的,因为 WITH 子句结合了查询 AST 树的两个不同分支的条件,或者沿着这条线。无论如何,如果两个条件都与同一个对象相关,则 WITH 子句有效:left join cat.kittens as *kitten* with *kitten*.bodyWeight > 10.0(来自休眠文档的示例)。实际上,每当我需要使用 WITH 时,它都不起作用;)

标签: sql hibernate hql criteria outer-join


【解决方案1】:

我认为您可以使用标准 API 和别名或子标准来解决您的问题。

Hibernate 标准创建别名,其中左外连接代表水果,内连接代表篮子。

Criteria criteria = getSession().createCriteria(Account.class).setProjection(
            Projections.projectionList()
                    .add(Property.forName("fruit.name"))
                    .add(Property.forName("basket.name"))
    );
    criteria.createAlias("fruits", "fruit",1);
    criteria.createAlias("baskets","basket",0);
    criteria.add(Property.forName("fruit.owner").eqProperty("basket.owner"));
    List<Object> l = criteria.add(Restrictions.eq( "id", some_joe_id_var ).list();

【讨论】:

  • 嗯,它相当于SELECT .. JOIN ... LEFT OUTER JOIN basket.fruits fruit WHERE fruit.owner = basket.owner,但它是不正确的。为什么?因为它将所有 Joe 的篮子与所有水果连接起来,然后过滤掉不属于 Joe 的水果的结果。它用 Ann 的苹果过滤掉 Joe 的绿色篮子,而这个绿色篮子应该出现在结果中(作为单行,带有 'green' basked 和 NULL 水果)
猜你喜欢
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多