1

我的一个 nhibernate 映射文件中有一个命名的本机 sql 查询,如下所示:

<sql-query name="GetAllClients">
    <return alias="clientList" class="IBeam.Core.Models.Client"/>
    <![CDATA[
      SELECT a.sname Name, a.scd Id
        FROM :MASTER_USER.smast      a,
        :MASTER_USER.fa_ledmast b,
        :TRAN_USER.fa_subledmast c
      WHERE a.scd = c.subledcd
        AND b.ledgercd = c.ledgercd
        AND b.ledtypecd = 'SDR'
        AND a.catflg  = 'N'
     group by a.scd, a.sname
     order by a.sname
   ]]>
</sql-query>

我从我的 c# 代码运行这个查询,如下所示:

var query = Repository.GetExecutingSession().GetNamedQuery("GetAllClients").SetString("MASTER_USER", "test$master").SetString("TRAN_USER", "test$tran");
var clients = query.List<Models.Client>();

但我收到错误:参数 MASTER_USER 在查询中不作为命名参数存在。我以前使用过命名查询并将参数传递给它,但从来没有作为模式名称。我认为它是将整体:MASTER_USER.smast视为表名,而不是区分参数名。如何将架构名称作为参数传递给此查询?

我找到了这个链接,所以我认为它可以完成。但我不知道该怎么做。

4

1 回答 1

3

首先,您的架构规范不能是 SQL 参数。替换需要由 NH 引擎执行,而不是由 SQL 引擎执行。因此,您的架构规范需要在 NH 占位符中(带尖括号)

然后,您提供的 Hibernate Link 不允许将模式作为参数传递。它允许从配置中提取默认模式。

也许(未尝试)您可以尝试这样的事情,使用(非常粗糙的)拦截器实现:

public class SchemaSqlInterceptor : EmptyInterceptor, IInterceptor
{

    public string MASTER_USER { get; set; }
    public string TRAN_USER { get; set; }


    NHibernate.SqlCommand.SqlString IInterceptor.OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
    {
        return sql.Replace("{MASTER_USER}", MASTER_USER).Replace("{TRAN_USER}", TRAN_USER);
    }
}

然后 :

    var interceptor = new SchemaSqlInterceptor();
    using (var session = sessionFactory.OpenSession(interceptor))
    {
        interceptor.MASTER_USER = "test$master";
        interceptor.TRAN_USER = "test$tran";
        var query = session.GetNamedQuery("GetAllClients");
        var clients = query.List<Models.Client>();
        session.Close();
    }

您的查询是:

<sql-query name="GetAllClients">
    <return alias="clientList" class="IBeam.Core.Models.Client"/>
    <![CDATA[
      SELECT a.sname Name, a.scd Id
        FROM {MASTER_USER}.smast      a,
        {MASTER_USER}.fa_ledmast b,
        {TRAN_USER}.fa_subledmast c
      WHERE a.scd = c.subledcd
        AND b.ledgercd = c.ledgercd
        AND b.ledtypecd = 'SDR'
        AND a.catflg  = 'N'
     group by a.scd, a.sname
     order by a.sname
   ]]>
</sql-query>
于 2013-04-02T12:09:37.527 回答