gpt4 book ai didi

nhibernate - 无法使用 nHibernate 执行存储过程

转载 作者:行者123 更新时间:2023-12-03 22:35:16 25 4
gpt4 key购买 nike

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

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

这是我的映射。 namespace 、架构、程序集、查询名称拼写正确。该文件名为 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>

经过相当多的故障排除后,我设法创建了一个 session 对象通过从映射中删除返回元素,如下所示。显然有问题但我不知道是什么。

<?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 创建它的 session 对象并尝试执行查询。但是,nHibernate 无法正确获取它的参数。我收到此错误消息:

{“预期位置参数计数:1,实际参数:[] [{GET_COLLATERAL(?)}]”

我试过:

调用 GET_COLLATERAL()

开始获取抵押品();结束;

上面包裹在 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

最佳答案

对于这个问题,或许可以做两方面的考虑:

  • 首先,没有输入参数的存储过程不需要带参数调用,所以这个问题评论说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 的简单代码。我希望这可能是您的解决方案。如果我错了请告诉我

问候

关于nhibernate - 无法使用 nHibernate 执行存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7183825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com