【发布时间】:2015-01-28 20:38:21
【问题描述】:
我正在与 NHibernate 命名查询和 PostgreSQL 搏斗,但无法让它工作。我在 PostgreSQL 数据库中有一个函数:
create or replace function x(results refcursor, id_ bigint)
returns refcursor
as
$$
begin
open results for
select
id,
name,
number
from
table_name
where
id = id_;
return results;
end;
$$ language plpgsql;
然后我在 NHibernate 中做了一个映射:
<sql-query name="SqlQueryForTesting">
<return-scalar column="id" type="long" />
<return-scalar column="name" type="string" />
<return-scalar column="number" type="string" />
<![CDATA[
begin;
select x('table_name_cursor', :id);
fetch all in table_name_cursor;
commit;
]]>
</sql-query>
最后制作了一个调用这个命名查询的方法。
public IList MethodForNamedQuery(int id)
{
var query = Session.GetNamedQuery("SqlQueryForTesting");
query.SetInt32("id", id);
return query.List();
}
问题是这段代码给了我一个错误。
System.IndexOutOfRangeException
Field not found
at Npgsql.NpgsqlRowDescription.FieldIndex(String fieldName)
at NHibernate.Driver.NHybridDataReader.GetOrdinal(String name)
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name)
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name, ISessionImplementor session, Object owner)
at NHibernate.Loader.Custom.CustomLoader.ScalarResultColumnProcessor.Extract(Object[] data, IDataReader resultSet, ISessionImplementor session)
at NHibernate.Loader.Custom.CustomLoader.ResultRowProcessor.BuildResultRow(Object[] data, IDataReader resultSet, Boolean hasTransformer, ISessionImplementor session)
at NHibernate.Loader.Custom.CustomLoader.GetResultColumnOrRow(Object[] row, IResultTransformer resultTransformer, IDataReader rs, ISessionImplementor session)
at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies)
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
NHibernate.Exceptions.GenericADOException
could not execute query
[ begin;
select x('table_name_cursor', :p0);
fetch all in table_name_cursor;
commit; ]
Name:id - Value:2
如果我通过 pgAdmin 运行查询,它可以完美运行并返回一行。所以我猜问题出在映射的某个地方。谁能说我的映射有什么问题?
【问题讨论】:
-
为什么要加
begin/commit? -
我也试过没有开始和提交。错误还是一样。
-
你能解决这个问题吗?
标签: c# postgresql nhibernate named-query