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

NHibernate将sql查询转换为NHibernate QueryOver查询

基础概念

NHibernate 是一个开源的 .NET 框架,用于将对象关系映射(ORM)到关系数据库。QueryOver 是 NHibernate 中的一个查询 API,它允许开发者以面向对象的方式编写查询,而不是直接编写 SQL 语句。QueryOver 通过将 LINQ 风格的查询转换为 NHibernate 可以理解的查询来实现这一点。

优势

  1. 面向对象编程:QueryOver 允许开发者以面向对象的方式编写查询,这使得代码更易于理解和维护。
  2. 类型安全:由于 QueryOver 是在编译时进行类型检查的,因此可以减少运行时错误。
  3. 可读性强:QueryOver 查询通常比直接编写的 SQL 语句更具可读性。
  4. 灵活性:QueryOver 支持复杂的查询操作,如连接、分组、排序等。

类型

QueryOver 支持多种类型的查询,包括但不限于:

  • 简单查询:选择单个实体或实体的集合。
  • 条件查询:基于特定条件过滤结果。
  • 连接查询:连接多个实体。
  • 分组和聚合查询:对结果进行分组和聚合操作。
  • 子查询:在查询中使用子查询。

应用场景

QueryOver 适用于各种需要与数据库交互的应用场景,特别是那些需要频繁修改和扩展查询逻辑的应用。例如:

  • Web 应用:用于处理用户请求并返回相应的数据库记录。
  • 企业应用:用于管理复杂的业务流程和数据关系。
  • 数据仓库:用于数据分析和报告。

遇到的问题及解决方法

问题:为什么 QueryOver 查询结果不正确?

原因

  1. 映射错误:实体类与数据库表之间的映射关系不正确。
  2. 查询逻辑错误:QueryOver 查询语句中的逻辑错误。
  3. 缓存问题:NHibernate 的一级缓存或二级缓存可能导致查询结果不一致。

解决方法

  1. 检查映射:确保实体类与数据库表之间的映射关系正确无误。
  2. 调试查询:使用 NHibernate 的日志功能输出生成的 SQL 语句,检查查询逻辑是否正确。
  3. 清除缓存:在必要时清除 NHibernate 的缓存,以确保查询结果的准确性。

示例代码

以下是一个简单的 QueryOver 查询示例:

代码语言:txt
复制
using NHibernate;
using NHibernate.Linq;
using System.Linq;

public class Product
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual decimal Price { get; set; }
}

public class ProductService
{
    private readonly ISession _session;

    public ProductService(ISession session)
    {
        _session = session;
    }

    public IList<Product> GetProductsByPrice(decimal minPrice, decimal maxPrice)
    {
        return _session.QueryOver<Product>()
            .Where(p => p.Price >= minPrice && p.Price <= maxPrice)
            .List();
    }
}

参考链接

通过以上信息,您应该能够更好地理解 NHibernate QueryOver 的基础概念、优势、类型、应用场景以及常见问题及其解决方法。

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

相关·内容

让OData和NHibernate结合进行动态查询

http://www.odata.org/ OData的特点就是可以根据传入参数动态生成Entity Framework的查询,最终实现动态的SQL查询。...在OData API查询时,用户前端是url跟参数,但是在服务器端,我们是接收到的是一个ODataQueryOptions对象,其实我们需要做的就是把这个对象进行解析,生成NHibernate能够理解的查询形式...0;            return queryString;        } ODataQueryOptions转换为HQL的项目在这里: http://aspnet.codeplex.com/.../NHibernateFilterBinder.cs Filter和OrderBy属性都会被转换成HQL,然后我们就需要进行NHibernate查询了。...其实系统给我们提供了一个专门分页返回的对象System.Web.Http.OData.PageResult,我们可以Service返回的QueryResult封装成PageResult再返回即可

40510
  • NHibernate的单表继承模式下通过父类Repository查询子类

    NHibernate中经常会遇到通过父类的Repository来查询子类的情况,比如现在有一个抽象的Employee对象,下面有OfficeUser和Teacher两个具体的对象,这两个对象都有其特有的属性...我们可以OfficeUser和Teacher都保存到Employee表中,然后建立了一个EmployeeRepository,使用Employee作为Query的入口,那么如果要查询Employee表中所有的...下面分别用QueryOver、Criteria和HQL来说明: QueryOver查询Employee表中的所有Teacher: Session.QueryOver().Where(...必须这么写,不能写成大写的Class,也不能换成其他字,只有这样才能让NHibernate理解,并正确返回结果。...以上是以最简单了例子说明了如果通过父类查询具体的子类的方法,实际项目中肯定比这个查询要复杂,但是只要记住了这三种查询的要点,结合其他条件就可以写出NHibernate能够理解的查询

    35120

    SQL Server字符串左匹配

    使用左匹配的好处是可以使用到SQL Server中对该字段建立的索引,使得查询效率很高,但是不好的SQL语句仍然会导致索引无法使用。...假设我们现在有个表YCMRSALE,其中有个字段MATNR存储了料号信息,如果我们要从这个表中查询出以AB开头的料号,如果使用NHibernate,那么我们常用的写法有: //QueryOver的写法...但是如果用NHibernate就要麻烦点了,我们必须要判断用户输入的字符串里面是否有特殊转移符,如果有,那么就需要进行替换,而且C#查询语句也有所不同。...Where条件: WHERE this_.Matnr like @p0 escape '~';@p0 = '~%00%' 以上说的都是在ORMapping的工具中进行左匹配查询,如果我们要在SQL语句中直接进行查询还有一种写法就是用...如果我们要改写成like的形式,那么就需要对matnr表中的matnr列进行处理,特殊字符进行替换,~%_[]这几个字符都替换掉。

    72410

    ORM for Net主流框架汇总与效率测试

    简单的说就是把数据库的关系型数据类型转换为用对象型程序控制的框架类型。...以下为10万条数据的查询排行,单位为毫秒(ms)。...缺点:配置文件比较多,t-sql在每个配置文件里面写,条件查询比较麻烦。 SubSonic 优点:删除和查询效果很好,添加比较慢。 缺点:语法比较接近Linq,语法自成一派比较不满意。...NHibernate 优点:覆盖功能比较全,稳定性好,集成性能好,使用比较广泛,支持t-sql和hql语法。 缺点:配置比较多,比较麻烦,效率比较慢。 NBear 优点:配置最简单。...缺点:操作语法不成熟,不支持t-sql,使用起来不方便,已经很久没有更新了。 ps:大家根据测试的结果自行选择合适的框架。

    92770

    LINQ在开发中的地位?

    DLINQ *.dbml文件该属于哪一层,的确Linq to Sql存在问题,DLINQ中,虽然可以在语言层级定义查询逻辑。...但是依然没有数据库持久化数据映射为领域对象,所以还是一种针对数据库的编程模型。 LINQ是微软将在C# 3.0中推出的语言集成查询技术,许多人也LINQ叫做微软的ORM。...但是依然没有数据库持久化数据映射为领域对象,所以还是一种针对数据库的编程模型。而Nhibernate则可以直接关系数据映射为领域模型,这是DLINQ的主要问题。...Nhibernate已经提供了许多帮助进行领域面向对象建模的特征。而DLINQ目前还无法拥有。 而LINQ + NHibernate的好处则是: 类型安全的查询,并且能使用智能提示功能!...从原理上来说,DLINQ是Lambda查询表达式解析为SQL语句:DLINQ => SQL,而NHLINQ则是Lambda查询表达式解析为HQL语句:NHLINQ => HQL。

    1.4K60

    Nhibernate_nhibernate与ef区别

    NHibernate用于把你的.Net对象持久化到底层的关系数据库中.你完全不用自己编写Sql语句去操作这些对象,NH会代替你做.你的代码里面只需要关心这些对象,NH生成sql语句并能为你取到正确的东西...步骤1:创建数据库表 我们正在做的是一个非常简单的NH示例.在这个例子里面,我们实现一个基本的用户管理子系统.我们将会使用一个user表(sql server 2000): use NHibernate...varchar(40) default NULL, LastLogon datetime default NULL, PRIMARY KEY (LogonID) ) go 我使用的是MS Sql...怎样生成Primary Key(NH很方便的就能给你生成一个,不管是什么类型的,只要你告诉它怎样去做).在我们举的例子中,把它设置成"assigned",意思是"我们的对象将自己生成key"(User对象总是需要一个...载入,保存和查询你的对象. 5. Flush()你的Session 好,让我们来看看一些代码: 创建一个Configuration对象....

    59430

    NHibernate教程

    对象/关系数据库映射(object/relational mapping (ORM))这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。...NHibernate除了能将一张表映射为一个对象,还可以表间关系变为对象的属性。例如学生和课程间的多对多关系就可以转化为学生类中的一个课程集合的属性。...由此可见,NHibernate不仅仅管理.Net类到数据库表的映射,还提供数据查询和获取数据的方法。因此采用NHibernate,可以大幅度减少开发时人工使用SQL处理数据的时间。...> (2)然后NHibernate唯一的一个dll(NHibernate.dll)添加到工程的引用中,步骤如下: à à 2....可以用Sql语句来创建,也可以用其他方式创建。

    36910

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

    提供了一个通过主键检索对象和导航链接查询对象时的一级缓存。也就是EF Core中的导航属性。...dialect 数据库方言,表示NHibernate连接的数据库是什么,该用哪种格式解析关系映射到数据库SQL语句 default_schema 默认的schema,用来设置连接字符串连接的数据库默认的...max_fetch_depth 最大递归深度,表示一次查询中直接加载的导航属性深度。默认是不直接加载导航属性,基于延迟加载的逻辑,由实际使用时才从数据库中加载数据。...show_sql 是否在控制台中打印转换的SQL语句,一般在调试的过程中会设置为true,用来确认生成的SQL是否正确等。...其中create表示每次只创建新增的;create-drop表示每次ISessionFactory创建时创建表 ,ISessionFactory关闭时,删除表;其中update表示每次都会将DDL SQL

    1.2K20

    Fluent NHibernate之旅(四)-- 关系(上)

    Mapping 今天我们说一下ORM中的R映射,我们现在的数据库大多都是关系型数据库了,所以可以说关系在我们数据库设计中也是非常重要的部分,NHibernate也非常重视这一块,但在传统方式中,配置就比较麻烦...我们的一对一简单映射也说完了,同时也完成了Component的映射,接下来说说延迟加载 一对一延迟加载 细心的朋友一定会发现我们的output出来的Sql语句,使用的是联合查询,但有时对我们来说,只需要...User就可以了,我不需要查询UserDetail,或许你会说,使用以下方式来进行延迟加载: HasOne(u => u.Detail).Cascade.All().LazyLoad...Cascade.All().Fetch.Select(); HasOne(d => d.User).Cascade.All().Constrained(); 进行延迟加载,但结果只是分了2条Sql...语句进行的查询,并不是延迟加载,这一点可以通过Sql Server Profiler查看: ?

    1.2K60

    Nhibernate_juan benet

    NHibernate用于把你的.Net对象持久化到底层的关系数据库中.你完全不用自己编写Sql语句去操作这些对象,NH会代替你做.你的代码里面只需要关心这些对象,NH生成sql语句并能为你取到正确的东西...步骤1:创建数据库表 我们正在做的是一个非常简单的NH示例.在这个例子里面,我们实现一个基本的用户管理子系统.我们将会使用一个user表(sql server 2000): use NHibernate...varchar(40) default NULL, LastLogon datetime default NULL, PRIMARY KEY (LogonID) ) go 我使用的是MS Sql...怎样生成Primary Key(NH很方便的就能给你生成一个,不管是什么类型的,只要你告诉它怎样去做).在我们举的例子中,把它设置成”assigned”,意思是”我们的对象将自己生成key”(User对象总是需要一个...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站立刻删除。

    37750

    NHibernate学习笔记之一,Hello world!

    NHibernate是一个面向.NET环境的对象/关系数据库映射框架,主要应用在数据持久层,和其它的ORM框架一样用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。...:http://sourceforge.net/projects/nhibernate/files/,如果嫌麻烦,可以下载本文示例,中间包含了NHibernate。...2、新建项目并添加引用,NHibernate-3.3.0.GA-bin中的“Iesi.Collections.dll”与“NHibernate”引用到项目中,如图2所示复制Configuration_Templates...该文件POPO类型与数据表进行映射。User.hbm.xml内容如下所示。 <?xml version="1.0" encoding="utf-8" ?.../事务开始                 ITransaction transaction = session.BeginTransaction();                 //执行HQL查询

    60020
    领券