使用NHibernate执行多个SQL语句

本文关键字:SQL 语句 NHibernate 执行 使用 | 更新日期: 2023-09-27 17:51:12

尝试在NHibernate中执行以下SQL语句时出现错误。它们在TOAD中工作良好。环境为Oracle, C#, .NET 4NHibernate

StringBuilder sb = new StringBuilder();
//some logic to select data from table1 in the where 
//clause of the following statement
sb.Append(" insert into temp_table select * from table1 where ....; ");     
sb.Append(" select t1.col1, t2.col2 from temp_table t1 join table2 t2 on t1.col1 = t2.col2 ");
IQuery query = Session.GetISession().CreateSQLQuery(sb.ToString()).SetResultTransformer(Transformers.AliasToBean(typeof(Class1)));
return query.List<Class1>();

我得到的错误。

ORA-00911: invalid character 
[GenericADOException: could not execute query....

如果我复制NHibernatetoad中生成的sql,则相同的查询工作

使用NHibernate执行多个SQL语句

恐怕你不能在nhibernate中这样做:

你应该先插入:

Session.GetISession().CreateSQLQuery("insert ....").ExecuteUpdate();
然后执行select:
IQuery query = Session.GetISession().CreateSQLQuery("select ...".SetResultTransformer(Transformers.AliasToBean(typeof(Class1)));    
query.List<Class1>();

或者最好使用storedprocedure

如果您创建两个不同的方法,每个方法独立地打开和关闭会话,并一个接一个地调用,则可以做到这一点。但是在这个特定的示例中,当您选择并插入到临时表中时,我认为如果您直接在DB(在存储过程中)上执行该操作会更容易

因此,您可以使用存储过程并从DAO层调用它,其中存储过程具有插入和选择…在DAO层中,按如下方式调用存储过程:

    session.CreateSQLQuery("exec [dbo].[MY_STORED_PROCEDURE] :param1, :param2")
   .setParameter("param1", p1, NHibernateUtil.(dataType of p1)
   .setParameter("param2", p2, NHibernateUtil.(dataType of p2)
   .setResultTransformer...

您的存储过程看起来像这样:(只是一个例子):

     declare @table table(col1 int, col2 datetime, col3 nvarchar(50)...) 
     --here u add whatever columns you will be selecting...

然后简单地做:

     insert into @table
     select * from table1

然后执行select:

    select t1.col1, t2.col2 from @table t1
    join table2 t2 on t2.col1 = t2.col2

,然后保存存储过程,并像我的示例中那样调用它。希望对大家有所帮助