尝试在SQL
中执行以下NHibernate
语句时出错。它们在TOAD
中运行良好。环境为Oracle
,C#
,.NET 4
和NHibernate
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}}中生成的同一查询有效。
答案 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
然后保存存储过程,并在我的示例中调用它。 希望这有帮助