无法使用nHibernate执行存储过程

时间:2011-08-25 00:22:48

标签: nhibernate

首先,如果有多种资源(理论上),我很抱歉再问这个问题 解释一下。我列出了我在这个问题底部使用的参考文献,希望他们会这样做 如果没别的话,帮助别人。

我正在尝试在oracle 11数据库上执行一个简单的存储过程。我的意图是创造 来自通过SYS_REFCURSOR返回的数据的List {T}对象。 我尝试创建一个nhibernate会话对象时,我收到此错误消息: {“命名查询中的错误:{GET_COLLATERAL}”}

这是我的映射。命名空间,模式,程序集,查询名称拼写正确。 该文件名为GetCollat​​eral.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只允许我发布两个链接:

Oracle stored procedures, SYS_REFCURSOR and NHibernate

http://www.techonthenet.com/oracle/questions/cursor1.php

1 个答案:

答案 0 :(得分:0)

也许可以针对这个问题做两件事:

  • 首先,没有输入参数的存储过程不需要使用参数调用,因此这个问题评论说calling sp with out ref cursor以这种方式调用SP { call GET_COLLATERAL }
  • 其次,要使用“未映射”类作为结果集,您应该指示nhibernate关于“未映射”类,因此尝试在映射文件的顶部添加<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的简单代码。 我希望这可能是你的解决方案。如果我错了,请告诉我

此致