使用NHibernate执行多个SQL语句

时间:2014-03-21 17:05:05

标签: c# oracle nhibernate

尝试在SQL中执行以下NHibernate语句时出错。它们在TOAD中运行良好。环境为OracleC#.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....

如果我复制sql NHibernate在[{1}}中生成的同一查询有效。

2 个答案:

答案 0 :(得分:0)

AFAIK你不能在nhibernate中这样做:

你应该先插入:

Session.GetISession().CreateSQLQuery("insert ....").ExecuteUpdate();

然后执行选择:

IQuery query = Session.GetISession().CreateSQLQuery("select ...".SetResultTransformer(Transformers.AliasToBean(typeof(Class1)));    
query.List<Class1>();

或者更好地尝试使用storedprocedure

答案 1 :(得分:0)

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

因此,您可以使用存储过程并从DAO层调用它,其中存储过程同时具有insert和select ...在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 t1.col1, t2.col2 from @table t1
    join table2 t2 on t2.col1 = t2.col2

然后保存存储过程,并在我的示例中调用它。 希望这有帮助