【问题标题】:nhibernate generating 2 different queries for the same source on 2 different machinesnhibernate 在 2 台不同的机器上为同一个源生成 2 个不同的查询
【发布时间】:2011-05-12 13:34:06
【问题描述】:


我在两台不同的机器上运行相同的代码和相同的 hbms,每台机器都使用 nhibernate 3(一切都在源存储库中,并且从那里签出最新版本)并且 nhibernate 在每台机器上生成不同的 sql 查询

SearchResult<Contact> searchResult = new SearchResult<Contact>();
            RepositoryLink<Contact> link = new RepositoryLink<Contact>();


                ICriteria icriteria = null;
                var clientCriteria = DetachedCriteria.For<Contact>("c")
                                        .CreateCriteria("ContactRoles","cr", NHibernate.SqlCommand.JoinType.InnerJoin)
                                        .CreateCriteria("AclRole", "ar" ,NHibernate.SqlCommand.JoinType.InnerJoin)
                                        .Add(Restrictions.Eq("ar.RoleName", RoleCode.Client));


            foreach (var keyValuePair in searchCriteria)
            {
                switch (keyValuePair.Key)
                {
                    case SearchClientCriterion.Branch:
                        clientCriteria.CreateCriteria("c.BuEntries", "be" , NHibernate.SqlCommand.JoinType.InnerJoin)
                            .CreateCriteria("be.BuLevel","bl", NHibernate.SqlCommand.JoinType.InnerJoin)
                            .Add(Restrictions.Eq("bl.LevelNo", keyValuePair.Value));
                        break;
                    case SearchClientCriterion.City:
                        clientCriteria.Add(Restrictions.Eq("c.City", keyValuePair.Value));
                        break;
                    case SearchClientCriterion.ClientID:
                        clientCriteria.Add(Restrictions.Eq("c.ID", keyValuePair.Value));
                        break;
                    case SearchClientCriterion.DOB:
                        break;
                    case SearchClientCriterion.FirstName:
                        clientCriteria.Add(Restrictions.Like("c.FirstName", keyValuePair.Value,MatchMode.Anywhere));
                        break;
                    case SearchClientCriterion.LastName:
                        clientCriteria.Add(Restrictions.Like("c.LastName", keyValuePair.Value, MatchMode.Anywhere));
                        break;
                    case SearchClientCriterion.State:
                        clientCriteria.Add(Restrictions.Eq("c.StateId", keyValuePair.Value));
                        break;
                }
            }

            if(buLevel > 0)
                clientCriteria.CreateCriteria("c.BuEntries", "be", NHibernate.SqlCommand.JoinType.InnerJoin)
                        .CreateCriteria("be.BuLevel", "bl", NHibernate.SqlCommand.JoinType.InnerJoin)
                        .Add(Restrictions.Eq("bl.LevelNo", buLevel));


            var clientCountCriteria = (ICriteria)clientCriteria.GetExecutableCriteria(link.Session).Clone();
            searchResult.Count = clientCountCriteria.SetProjection(Projections.CountDistinct("c.ID")).UniqueResult<int>();


            icriteria = clientCriteria.GetExecutableCriteria(link.Session);
            searchResult.Data = icriteria.SetFirstResult((pageIndex - 1) * pageSize).SetMaxResults(pageSize).List<Contact>();

这是标准 这会生成:

SELECT count(distinct this_.contactkey) as y0_
FROM   [Contact] this_
       inner join [ContactRole] cr1_
         on this_.contactkey = cr1_.contactkey
       inner join [AclRole] ar2_
         on cr1_.rolekey = ar2_.rolekey
WHERE  ar2_.rolename = 'C' /* @p0 */
       and this_.firstname like '%alex%' /* @p1 */

在一台机器上

SELECT count(distinct this_.contactkey) as y0_
FROM   [Contact] this_
       left outer join [ContactRole] contactrol1_
         on this_.contactkey = contactrol1_.contactkey
       left outer join [AclRole] aclrole2_
         on contactrol1_.rolekey = aclrole2_.rolekey
WHERE  this_.username like '%alex%' /* @p0 */
       and not (aclrole2_.rolename = 'C' /* @p1 */)

有人知道这是为什么吗?

【问题讨论】:

  • 两个版本是否指向同一个数据库,会话工厂配置是否相同?

标签: .net sql nhibernate criteria


【解决方案1】:

你不会碰巧在配置上有区别: 区别

            <property name="use_outer_join">true</property>

在会话工厂中可能是您​​的问题的原因。

【讨论】:

  • 我有一个 Web 服务在调用者 Web 服务中调用另一个 Web 服务,这个属性确实在那里,我还是删除了它。在被调用的 Web 服务中,该属性不存在,但它是生成上述 2 个查询的 Web 服务。我看不出第一个服务中的设置会如何影响第二个服务。
  • @Para 您提到了 2 台不同的机器生成查询。这两者的配置之间是否有任何不匹配?
  • 对我来说,NH 3.2 中的属性 use_outer_join 会产生错误,已弃用-过时
【解决方案2】:

最后我重新创建了整个数据库。删除了所有内容。重新创建了它。 再次检查了所有内容,现在它工作了。

【讨论】:

  • 问题解决了 :-) 但我很想知道真正的问题是什么。
  • @Tomas 我本来希望这样
猜你喜欢
  • 2010-10-29
  • 2011-09-15
  • 2021-04-17
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 2021-01-01
相关资源
最近更新 更多