首先,如果有多种资源(理论上),我很抱歉再问这个问题 解释一下。我列出了我在这个问题底部使用的参考文献,希望他们会这样做 如果没别的话,帮助别人。
我正在尝试在oracle 11数据库上执行一个简单的存储过程。我的意图是创造 来自通过SYS_REFCURSOR返回的数据的List {T}对象。 我尝试创建一个nhibernate会话对象时,我收到此错误消息: {“命名查询中的错误:{GET_COLLATERAL}”}
这是我的映射。命名空间,模式,程序集,查询名称拼写正确。 该文件名为GetCollateral.hbm.xml,并标记为嵌入式资源。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Poolman" namespace="Poolman.Entities" schema="poolman_own">
<sql-query name="GET_COLLATERAL" callable="true">
<return class="Poolman.Entities.IDNamePair">
<return-property name="ID" column="sort_order"></return-property>
<return-property name="Name" column="collateral"></return-property>
</return>
{GET_COLLATERAL(?)}
</sql-query>
</hibernate-mapping>
经过相当多的故障排除后,我设法获得了一个会话对象 通过从映射中删除返回元素,如下所示。显然它有问题 但我不知道是什么。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Poolman" namespace="Poolman.Entities" schema="poolman_own">
<sql-query name="GET_COLLATERAL" callable="true">
{GET_COLLATERAL(?)}
</sql-query>
</hibernate-mapping>
我不希望在没有返回映射的情况下获得结果集,但是使用上面的映射允许nhibernate创建其会话对象并尝试执行查询。但是,nHibernate无法正确获取它的参数。我收到此错误消息:
{“预期位置参数计数:1,实际参数:[] [{GET_COLLATERAL(?)}]”}
我试过了:
CALL GET_COLLATERAL()
BEGIN GET_COLLATERAL(); END;
上面包含在CDATA中
这是我的存储过程:
create or replace
PROCEDURE GET_COLLATERAL(p_cursor OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_cursor for
SELECT collateral, sort_order
FROM
(
-- Long query omitted. The query executes when pasted into a command window.
) ORDER BY sort_order ;
END;
这是我的实体类。这个类没有映射到任何一个表,但无论如何我试图为它创建一个映射。
namespace Poolman.Entities
{
public class IDNamePair
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
}
}
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping assembly="Poolman"
namespace="Poolman.Entities"
schema="poolman_own"
xmlns="urn:nhibernate-mapping-2.2">
<class name="IDNamePair" table="x">
<id></id>
<property name="ID" column="sort_order"/>
<property name="Name" column="collateral"/>
</class>
</hibernate-mapping>
以下是我用来调用查询的代码:
public List<Entities.IDNamePair> GetCollateral()
{
IQuery query = (IQuery)Session.GetNamedQuery("GET_COLLATERAL");
List<Entities.IDNamePair> list = new List<Entities.IDNamePair>();
System.Collections.IList result = query.List();
list = result.OfType<Entities.IDNamePair>().ToList();
return list;
}
我真的很感激任何帮助。我被卡住了。 以下是我发现的其他资源的链接,但没有人可以帮助我: 抱歉stackoverflow只允许我发布两个链接:
答案 0 :(得分:0)
也许可以针对这个问题做两件事:
{ call GET_COLLATERAL }
<import class="FullClassName" rename="ClassNameMayBeRenamed"/>
所以这可能是这个SP的映射:
....
<import class="Poolman.Entities.IDNamePair" />
....
<sql-query name="GET_COLLATERAL" callable="true">
<return class="Poolman.Entities.IDNamePair">
<return-property name="ID" column="sort_order"></return-property>
<return-property name="Name" column="collateral"></return-property>
</return>
{ call GET_COLLATERAL}
</sql-query>
调用代码可以是通过NHibernate调用SP的简单代码。 我希望这可能是你的解决方案。如果我错了,请告诉我
此致