首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

NHibernate - 从sql函数返回复杂对象

在这个问答内容中,NHibernate是一个用于.NET平台的对象关系映射(ORM)框架,它可以将数据库中的数据映射到.NET中的对象。使用NHibernate可以简化数据库访问和操作,提高开发效率。

在NHibernate中,可以使用SQL函数来返回复杂对象。SQL函数是在数据库中定义的一种可重用的计算过程,它可以接受参数并返回结果。在NHibernate中,可以使用HQL(Hive Query Language)或者原生SQL来调用SQL函数,并将返回的结果映射到.NET对象中。

以下是一个使用NHibernate调用SQL函数的示例:

代码语言:csharp
复制
// 定义SQL函数
public class GetComplexObject : SQLFunction
{
    public GetComplexObject()
    {
        super("get_complex_object", new String[]{"id"}, new Type[] {StandardBasicTypes.INTEGER});
    }

    public String render(Type firstArgumentType, List arguments, SessionFactoryImplementor factory)
    {
        return "get_complex_object(" + arguments.get(0) + ")";
    }
}

// 在HQL中调用SQL函数
String hql = "SELECT get_complex_object(id) FROM ComplexObject WHERE id = :id";
Query query = session.createQuery(hql);
query.setParameter("id", 1);
ComplexObject complexObject = query.uniqueResult();

// 在原生SQL中调用SQL函数
String sql = "SELECT get_complex_object(id) FROM ComplexObject WHERE id = :id";
Query query = session.createSQLQuery(sql);
query.addScalar("get_complex_object", new GetComplexObject());
query.setParameter("id", 1);
ComplexObject complexObject = query.uniqueResult();

在这个示例中,我们定义了一个名为get_complex_object的SQL函数,并在HQL和原生SQL中调用了这个函数。在调用函数时,我们传递了一个参数id,并将返回的结果映射到了一个名为ComplexObject的.NET对象中。

需要注意的是,在使用NHibernate调用SQL函数时,需要确保函数在数据库中已经定义,并且函数的返回类型需要与.NET对象的类型匹配。此外,在映射结果时,需要使用addScalar方法来指定函数的返回类型和映射关系。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Mysql常用函数——告别复杂sql

post/5ed3b3fb6fb9a047ed240575 概念: 相当于java中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名 隐藏了实现细节 提高代码的可重用性 使用: select 函数名...(实参列表)【from 表】 【】中内容可省略 正文: 字符函数: length:获取字节个数(utf-8 一个汉字为3个字节,gbk为2个字节) SELECT LENGTH('cbuc')...substr(str,pos) # str:要裁剪的字符串 , pos:要裁剪的长度 substr(str,pos,len) # str:要裁剪的字符串 , pos/len:哪个位置开始裁剪几位...# substring同理 instr:返回子串第一次出现的索引,如果没有则返回0 SELECT INSTR('蔡不菜','蔡') # 输出 1 (mysql是1开始算位数) trim...now:返回当前系统日期+时间 SELECT NOW() # 输出 2020-02-16 11:43:21 curdate:返回当前系统日期,不包含时间 SELECT CURDATE

96230
  • Golang 函数返回类型是接口时返回对象的指针还是值

    接口声明格式: type InterfaceName interface { //方法列表 } 2.函数返回类型是接口时返回对象的指针还是值 函数返回类型是接口时返回对象的指针还是值,这个要看具体的需要...期望原对象在后续的操作中被修改则返回对象的指针。返回对象的值则返回的是对象的副本,对对象副本的修改不会影响原对象返回对象的指针示例。...=createEmployeeObj() o.Set() o.Print() e.Print() } 输出结果: company=alibaba company=alibaba 可见函数返回类型是接口时返回对象的指针...返回对象的值示例。...company="alibaba" e1.Print() } e.Print() } 输出结果: company=alibaba company=tencent 可见函数返回类型是接口时返回对象的值

    8K30

    php json_encode()函数返回对象和数组问题

    php json_encode() 函数格式化数据时会根据不同的数组类型格式化不同类型的json数据 索引数组时 <?...php $arr = []; print_r(json_encode($arr)); //输出 [] 索引数组时生成的是数组类型数据,关联数组时生成的是对象类型的数据,空数组返回的是数组类型。...但是当碰到同一个字段返回的数组可能是关联数组也可能是空数组时,就会在app端出现数据类型不一致的问题,解决方式有两种: 一,使用 json_encode的 JSON_FORCE_OBJECT 模式 <?...php $arr = []; print_r(json_encode($arr,JSON_FORCE_OBJECT)); //输出 {} 但是这种存在一个问题,它会把所有的数据都以对象的方式返回,包括索引数组...php $arr = new ArrayObject(); print_r(json_encode($arr)); //输出 {} 到这里我们可以随意的控制返回的json数据中数据的类型啦!!!!

    3.6K10

    【C++】拷贝构造函数调用时机 ② ( 对象值作为函数参数 | 对象值作为函数返回值 )

    指针 或 引用 的方式 ; // 定义函数, 接收 Student 对象值作为参数 void fun(Student s) { } ④ 对象值作为函数返回值 : 函数直接返回类的实例对象 值 , 不是返回...指针 或 引用 ; // 定义函数, 返回 Student 对象值作为返回值 Student fun() { Student s1(18, 170); return s1; } 一、拷贝构造函数概念...三、对象值作为函数返回值 ---- 1、拷贝构造函数调用情况说明 函数直接返回类的实例对象 值 , 不是返回 指针 或 引用 ; 下面的代码 , 定义了函数 , 返回函数内部创建的 Student 类实例对象...; // 定义函数, 返回 Student 对象值作为返回值 Student fun() { Student s1(18, 170); return s1; } 由于 函数作用域结束后 , 其栈内存会被释放..., 在栈内存中的 Student 对象也会被销毁 , 因此 Student 类型的返回值需要返回一个副本 , 这个副本需要调用 拷贝构造函数 创建 ; 2、代码示例 - 对象值作为函数返回值 代码示例

    22420

    NHibernate VS IbatisNet

    NHibernate对数据库结构提供了较为完整的封装,NHibernate的O/R Mapping实现了PO 和数据库表之间的映射,以及SQL 的自动生成和执行。...程序员甚至不需要对SQL 的熟练掌握,NHibernate 会根据制定的存储逻辑,自动生成对应的SQL 并调用ADO.NET接口加以执行。 ...具体的SQL 需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定PO。...使用IbatisNet提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的DotNet对象,这一层与通过NHibernate实现ORM 而言基本一致,而对于具体的数据操作,NHibernate会自动生成...IbatisNet 非常简单易学, NHibernate 相对较复杂,门槛较高。 2 . 二者都是比较优秀的开源产品 3 .

    75870

    Nhibernate_nhibernate与ef区别

    NHibernate用于把你的.Net对象持久化到底层的关系数据库中.你完全不用自己编写Sql语句去操作这些对象,NH会代替你做.你的代码里面只需要关心这些对象,NH生成sql语句并能为你取到正确的东西...步骤1:创建数据库表 我们正在做的是一个非常简单的NH示例.在这个例子里面,我们实现一个基本的用户管理子系统.我们将会使用一个user表(sql server 2000): use NHibernate...; } set { lastLogon = value; } } } } 在上面的代码里面,我们把属性和构造函数写成了....这个差异是由.Net和Java Reflect机制的不同引起的-zyyang).这种情况下,我们是Assembly NHibernate.Demo.QuickStart中载入NHibernate.Demo.QuickStart.User...让我们返回到"id" tag,你可能会猜想这个tag和映射到表的Primary Key有关.正确.ID tag的格式和Property tag的相似.我们Property(name)映射到目标数据库的字段

    59330

    【C++】匿名对象 ③ ( 函数返回值为对象值时 匿名对象 的 拷贝构造函数 与 析构函数 调用情况分析 )

    对象值作为参数 void fun(Student s) { } ④ 对象值作为函数返回值 : 函数直接返回类的实例对象 值 , 不是返回 指针 或 引用 ; // 定义函数, 返回 Student 对象值作为返回值...Student fun() { Student s1(18, 170); return s1; } 二、当函数返回值为对象时的情况分析 ---- 1、函数返回对象值时返回值为匿名对象 如果一个 函数返回值..., 匿名对象销毁 ; 3、代码示例 - 函数返回的匿名对象 初始化 变量 在下面的代码中 , fun 函数返回值是 Student 类型的匿名对象 ; // 函数返回值是 Student 类型的对象...fun 函数中 , 函数返回对象值时 , 创建 要返回的 普通对象副本 , 也就是一个 匿名对象 ; 调用析构函数 : m_age = 12 这是 fun 函数执行完毕 , 在函数作用域中的 普通对象...m_age = 12 这是在 fun 函数中 , 调用 有参构造函数 , 创建 普通对象 ; 调用拷贝构造函数 这是在 fun 函数中 , 函数返回对象值时 , 创建 要返回的 普通对象副本 , 也就是一个

    30320

    关于C++函数返回局部对象的详细分析

    以前一直挺好奇的,C++是怎么在函数返回一个局部对象的。...因为按照我之前的想法,函数返回一个基本类型的值是通过存放到ecx实现的(关于浮点不了解),但是局部对象又是比较大的,很明显不能使用寄存器作为通用解决方案,虽然也能猜想到可能是用函数栈实现的,但是具体如何没了解过...,今天偶有闲时兴趣正浓仔细看了一遍汇编大概了解了 VS编译器对于函数返回局部对象的处理方法, 这里分享出来与君共勉。...代码非常简单,首先定义一个对象,然后定义一个函数返回一个局部对象,最后主函数调用该函数 class ReturnAnObject { public: int arr[10]; int num; };...dword ptr es:[edi],dword ptr [esi] return 0; ;;;;eax清零 xor eax,eax 至此在Debug模式下返回被掉函数局部对象然后赋值给当前调用函数局部变量就完成了

    3.5K10

    【JavaScript】函数 ⑤ ( return 关键字终止函数 | return 关键字返回一个值 | return 关键字返回多个值 - 返回数组对象 )

    一、JavaScript 函数返回值 1、return 关键字终止函数 return 关键字 除了 返回 函数返回值 功能之外 , 还具有 终止 函数执行 的作用 , return 关键字后面的语句...// 函数返回值 var ret = add(1, 2); console.log("函数返回值 : " + ret); ..., num1 + num2; } // 函数返回值 var ret = add(1, 2); console.log("函数返回值 :..." + ret); 执行结果 : 只返回了最后一个值 ; 3、return 关键字返回多个值 - 返回数组对象..., add 函数返回一个数组 [num1, num2, num1 + num2] , 此时数组对象被当做一个返回值对待 , 因此 可以使用 return 关键字返回 ; <!

    16610

    NHibernate详解

    Nhibernate 来源于非常优秀的基于Java的Hibernate 关系型持久化工具。 NHibernate 数据库底层来持久化你的.Net 对象到关系型数据库。...NHibernate 为你处理这些,远胜于你不得不写SQL数据库存取对象。你的代码仅仅和对象关联,NHibernat 自动产生SQL语句,并确保对象提交到正确的表和字段中去。...4.构建一个让NHibernate知道如何连接数据库的配置文件 5.使用NHibernate的API 第一步:写构建表的SQL 这里我们将使用的是一个非常简单的例子...NHibernate通过对象属性的反射来工作,因此我们需要添加我们希望持久化的对象属性。...在这个例子里我们装配件(最后编译的DLL文件名称)NHibernate.Examples 装载类NHibernate.Examples.QuickStart.User 。

    68530

    Nhibernate_juan benet

    什么是NHibernate? NHibernate是一个基于.Net,用于关系数据库的对象持久化类库.它是著名的Hibernate的.Net版本....NHibernate用于把你的.Net对象持久化到底层的关系数据库中.你完全不用自己编写Sql语句去操作这些对象,NH会代替你做.你的代码里面只需要关心这些对象,NH生成sql语句并能为你取到正确的东西...步骤1:创建数据库表 我们正在做的是一个非常简单的NH示例.在这个例子里面,我们实现一个基本的用户管理子系统.我们将会使用一个user表(sql server 2000): use NHibernate....这个差异是由.Net和Java Reflect机制的不同引起的-zyyang).这种情况下,我们是Assembly NHibernate.Demo.QuickStart中载入NHibernate.Demo.QuickStart.User...让我们返回到”id” tag,你可能会猜想这个tag和映射到表的Primary Key有关.正确.ID tag的格式和Property tag的相似.我们Property(name)映射到目标数据库的字段

    37750

    C# 数据操作系列 - 11 NHibernate 配置和结构介绍

    ISessionFactory - NHibernate.ISessionFactory: 一个基于单数据库的已编译的映射缓存,它是持久不变的且线程安全(额,这句话是它的文档翻译过来的)。...ISession - NHibernate.ISession: 一个单线程、短生命周期的对象,表示应用程序和数据持久化之间一个连接。...状态分为以下三种: transient 暂存的、临时的 该状态的对象并没有被持久化上下文捕获到,简单来讲就是刚被创建,还没有数据库/持久化上下文中获取到主键信息。...这种状态通常是数据库中获取到数据或者新建的数据附加到了上下文中。 detached 游离态 该状态的对象是从上下文中分离出来的,有了数据库主键,曾经或现在仍然有一条数据库记录与之对应。...show_sql 是否在控制台中打印转换的SQL语句,一般在调试的过程中会设置为true,用来确认生成的SQL是否正确等。

    1.2K20

    NHibernate中关于Inverse的理解和使用

    在使用NHibernate进行数据库操作的时候,比如数据插入的时候,经常用到级联功能,比如最常见的就是一个订单对应多个明细行,在保存订单时只需要Save订单对象即可,订单下的所有明细行会级联保存。...对于OrderItem对象,其中可以没有Order对象的引用,如果有Order对象的引用,那么就是双向关联Bidirectional!...数据库模型来说,这个不合理啊! 所以一般建议在Mapping时设置Inverse为True。对应的,在Code中也需要设置OrderItem对Order的引用。...来说,这样设置是对的,但是生成SQL却有问题: 1: NHibernate: INSERT INTO EMP (NAME, EMP_ID) VALUES (@p0, @p1);@p0 = 'E1...总结: Inverse用于设置双向关联时Nhibernate在设置外键时依赖的对象,默认Inverse=False,一对多时表示依赖一端的集合,如果为True表示依赖多段对象中对一端对象的引用。

    46630

    c# 常用框架整理

    对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。...NHibernate来源于非常优秀的基于Java的Hibernate关系型持久化工具。NHibernate数据库底层来持久化你的.Net对象到关系型数据库。...NHibernate为你处理这些,你不用自己写SQL去数据库存取对象。...你 的代码仅仅和对象关联,NHibernat自动产生SQL语句,并确保对象提交到正确的表和字段中去.大量减少开发时人工使用SQL和ADO.NET处理 数据的时间....NHibernate可以帮助你消除或者包装那些针对特定数据库的SQL代码,并且帮你把结果集表格式的表示形式转换到一系列的对象去。

    4.9K10
    领券