【问题标题】:NHibernate join query throwing errorNHibernate 连接查询抛出错误
【发布时间】:2014-07-25 05:02:39
【问题描述】:

我正在尝试实现一个连接查询。我需要获取列 id 的名称

string hql = "select new TerminalStateReportItem(p.Ip, p.Error, p.Terminal_Id, p.Last_Activity, p.Current_Page, p.Ping, u.Name) from TerminalState p join User u on p.Terminal_Id=u.Id";
var query = new SimpleQuery<TerminalStateReportItem>(hql);
return query.Execute();

我收到一个错误

Castle.ActiveRecord.Framework.ActiveRecordException: 无法为 TerminalStateReportItem 执行 ExecuteQuery ---> NHibernate.Hql.Ast.ANTLR.SemanticException: 路径需要加入! [select new TerminalStateReportItem(p.Ip, p.Error, p.Terminal_Id, p.Last_Activity, p.Current_Page, p.Ping, u.Name) from KioskServer.TerminalState.TerminalState p join User1 u on p.Terminal_Id=u。编号]

我的类包装器

namespace KioskServer.Reports
{
    [ActiveRecord]
    public class TerminalStateReportItem
    {
        public TerminalStateReportItem()
        {
        }

        public TerminalStateReportItem(string ip, string error, int terminalId, DateTime lastActivity, string currentPage, int ping, string name)
        {
            Ip = ip;
            Error = error;
            Terminal_Id = terminalId;
            Last_Activity = lastActivity;
            Current_Page = currentPage;
            Ping = ping;
            Name = name;
        }

        [PrimaryKey]
        public string Ip { get; set; }
        public string Error { get; set; }
        public int Terminal_Id { get; set; }
        public DateTime Last_Activity { get; set; }
        public string Current_Page { get; set; }
        public int Ping { get; set; }
        public string Name{ get; set; }
    }
}

我的班级表

namespace KioskServer.TerminalState
{
    [ActiveRecord("terminal_state")]
    public class TerminalState
    {
        public TerminalState(){
        }

        public TerminalState(string ip, string error, int terminalId, DateTime lastActivity, string currentPage, int ping)
        {
            Ip = ip;
            Error = error;
            Terminal_Id = terminalId;
            Last_Activity = lastActivity;
            Current_Page = currentPage;
            Ping = ping;
        }

        [PrimaryKey]
        public string Ip { get; set; }
        [Property]
        public string Error { get; set; }
        [Property]
        public int Terminal_Id { get; set; }
        [Property]
        public DateTime Last_Activity { get; set; }
        [Property]
        public string Current_Page { get; set; }
        [Property]
        public int Ping { get; set; }
    }
}

不加入所有作品都正常。可能是因为我的课程在不同的文件夹中?

namespace KioskServer.Data.Users
{
    [ActiveRecord("users",
        DiscriminatorColumn = "usertype",
        DiscriminatorType = "string",
        DiscriminatorValue = "user")]
    public class User : Entity
    {
        [Property]
        public string Name { get; set; }

        [Property]
        public string Login { get; set; }

        [Property]
        public string Password { get; set; }

        [Property]
        public DateTime Date { get; set; }

        [BelongsTo]
        public Dealer Dealer { get; set; }
    }
}

我做一个查询

string hql = "select new TerminalStateItem(p.Ip, p.Error, p.Terminal_Id, p.Last_Activity, p.Current_Page, p.Ping, u.Name) from TerminalState p join p.User u";

错误

NHibernate.QueryException: could not resolve property: User of: KioskServer.TerminalState.TerminalState [select new TerminalStateItem(p.Ip, p.Error, p.Terminal_Id, p.Last_Activity, p.Current_Page, p.Ping, u.Name) from KioskServer.TerminalState.TerminalState p join p.User u]

【问题讨论】:

    标签: c# nhibernate join


    【解决方案1】:

    HQL 是一种在您的领域模型上运行的语言。它不是 SQL。这是什么意思?

    在 SQL 中你可以说:

    SELECT **
    FROM  TerminalState p   -- (table TerminalState)
    JOIN User1 u            -- (table User1)
    ON p.Terminal_Id = u.Id -- (the relation   
    

    在 HQL 中你不能!因为 ON 是由关系定义的……由 path 定义。所以这里的 Exception 说:

    预期加入的路径!

    域关系,对象之间的路径,例如这将在 HQL 中工作:

    select new p.Ip, u.Name ...
    from TerminalState p 
    // now the PATH
    join p.User u  // not needed on p.Terminal_Id=u.Id";
    

    ON(NHibernate 生成的 SQL 语法没有我们的明确定义) 必须来自映射。 TerminalState 上必须有 User 属性映射为 many-to-one...

    在这里查看更多:

    如果你需要一些特殊的 SQL,你仍然可以使用 NHibernate 来获取它,只需使用:

    session.CreateSQLQuery() // could contain any valid SQL
    

    而不是session.CreateQuery() (期待 HQL)

    【讨论】:

    • join p.User u not worcking join User u not worcking 我添加了问题。我仍然无法连接
    • 但是抛出不同的异常对吗?也许你应该用这个进展来更新你的问题。另外,请查看我的链接,以进一步了解 hql,因为您使用 new() 进行的选择不是 hql,我会说..
    • 再次更新问题。求求你,再看一遍
    • 就是这样,正如我在答案的一部分中解释的那样:User 必须是TerminalState 的属性,才能在 HQL 中使用它......用于 JOIN。事实并非如此。您不能将这种联接与 HQL 一起使用。它是由 Domain 模型 驱动的,而不是由 SQL... 有帮助吗?还是我还不清楚? ... HQL 是一种基于现有关系的查询语言... 它不能创建新的 ON 关系... 只是这些已映射。请尝试阅读我给你的文档
    【解决方案2】:

    你应该有一个映射
    [财产] 公共用户用户{获取;放; }

    在类 TerminalStateReportItem 中

    然后就可以查询了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 2017-03-11
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多