【问题标题】:Order of joins for NHibernateNHibernate 的连接顺序
【发布时间】:2015-06-19 11:12:02
【问题描述】:

我在使用 Nhibernate 时遇到了问题 - 它将右连接放在其他连接的中间。这是我的代码:

private DetachedCriteria GetBaseCriteria()
{
    return DetachedCriteria.For<Foo>("foo")
        .CreateAlias("foo.Bar", "bar")
        .CreateAlias("bar.Baz", "baz", JoinType.InnerJoin);
}

public void Method()
{
    var criteria = GetBaseCriteria();

    criteria.CreateAlias("foo.Something", "something", JoinType.RightOuterJoin);

    ...
}

而生成的 SQL 是

SELECT *
FROM foo
INNER JOIN bar ON ...
RIGHT OUTER JOIN something s ON ...
INNER JOIN baz ON ...       
WHERE ...

很遗憾,该查询的结果与预期的不同

SELECT *
FROM foo
INNER JOIN bar ON ...
INNER JOIN baz ON ...
RIGHT OUTER JOIN something s ON ...     
WHERE ...

我试图更改 GetBaseCriteria 中别名的顺序 - 但没有运气...

【问题讨论】:

  • 为什么需要第二个 SQL?如果您有特定问题需要根据需要进行查询,那么本机查询可能是您的最佳选择。
  • 限制是我们想重用 BaseCriteria 但有时我们想产生类似报告的结果,在我的示例中,我将按 Somenthing 和项目计数进行分组。虽然相同的代码用于普通查询 - 没有正确的连接。不幸的是,这些查询对于普通 SQL 来说太复杂了。
  • 嗨,你知道怎么做吗?
  • 嘿@Garuda,如果我没记错的话 - 不幸的是没有。我认为我们在代码中使用了简化的查询和附加逻辑
  • 嗨@JleruOHeP,感谢您回复我的评论。我可以想办法做到这一点。正如我已经发布了答案。

标签: c# nhibernate right-join


【解决方案1】:

在我的例子中,我可以通过简单地重新排列 ***.hbm.xml 文件中定义的关系来更改 NHibernate 形成的查询的顺序。

例如如果 foo.hbm.xml 被定义为

<class name="***, ***" table="foo" >
...
<many-to-one name="bar">...</many-to-one>
<many-to-one name="something">...</many-to-one>
<many-to-one name="baz" >...</many-to-one>

只需改变 bar、something 和 baz 的顺序,如下所示

<class name="***, ***" table="foo" >
...
<many-to-one name="bar">...</many-to-one>
<many-to-one name="baz" >...</many-to-one>
<many-to-one name="something">...</many-to-one>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-08
    • 2016-07-12
    • 2011-10-04
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多