`

Use Fetch in NHibernate to solve N+1

 
阅读更多

 

http://bartwullems.blogspot.com/2012/03/nhibernate-eager-fetching.html

 

NHibernate eager fetching

 
NHibernate supports the concept of eager fetching for a long time. However there are some things to consider when you start using this with the out-of-the-box NHibernate Linq provider.
Let’s first look at the obvious way:
  1. var customers = session  
  2. .Query<Customer>()  
  3. .Fetch(c => c.Orders)  
  4. .ToList();  

This will return the customer and all the customer’s orders in a single SQL statement.
Rule #1: Fetch() statements must always come last.
If you want to mix Fetch with other clauses, Fetch must always come last. The following statement will throw an exception:
  1. var customers = session  
  2. .Query<Customer>()  
  3. .Fetch(c => c.Orders)  
  4. .Where(c => c.CustomerId == "ABC")  
  5. .ToList();  

But this will work fine:

  1. var customers = session  
  2. .Query<Customer>()  
  3. .Where(c => c.CustomerId == "ABC")  
  4. .Fetch(c => c.Orders)  
  5. .ToList();  

Rule #2: Don’t fetch multiple collection properties at the same time.
Be careful not to eagerly fetch multiple collection properties at the same time. The following statement will execute a Cartesian product query against the database, so the total number of rows returned will be the total Subordinates times the total orders.

  1. var employees = session  
  2. .Query<Employee>()  
  3. .Fetch(e => e.Subordinates)  
  4. .Fetch(e => e.Orders)  
  5. .ToList();  

Rule #3: Fetch grandchild collections using FetchMany.
You can fetch grandchild collections too.  The following statement will throw an exception:

  1. var customers = session  
  2. .Query<Customer>()  
  3. .Fetch(c => c.Orders)  
  4. .Fetch(c => c.Orders.OrderLines)  
  5. .ToList();  

But if you use ‘FetchMany’ and ‘ThenFetchMany’ it will work fine:

  1. var customers = session  
  2. .Query<Customer>()  
  3. .FetchMany(c => c.Orders)  
  4. .ThenFetchMany(o => o.OrderLines)  
  5. .ToList();  
分享到:
评论

相关推荐

    How to solve the hibernate N+1 problem?

    N+1问题是指在进行一对多或多对多关联查询时,原本期望通过一次SQL查询获取所有数据,但实际执行了N+1次查询,其中N为一端实体的数量,这极大地影响了应用性能。 描述中提到的链接指向了一篇博客文章,虽然具体内容...

    hibernate N+1问题解决办法

    **标题:“Hibernate N+1问题解决办法”** 在Java开发中,使用Hibernate作为ORM框架时,我们可能会遇到一个性能上的问题,那就是著名的“N+1查询问题”。此问题源于不恰当的数据加载策略,可能导致数据库查询效率...

    ibatis N+1问题

    在IT行业中,数据库查询优化是提升系统性能的关键环节之一,而"Ibatis N+1问题"是使用MyBatis框架时常见的性能瓶颈。这个问题通常出现在一对多或者多对多的关联查询中,导致了大量的数据库交互,严重影响了应用的...

    react16+redux+sage+fetch+route4.0+antd+webpack 框架

    Fetch API 是浏览器原生提供的网络请求接口,替代了传统的 XMLHttpRequest。它使用 Promises 处理异步请求,提供了更简洁的语法和更好的错误处理机制。Fetch API 可以用于获取 JSON、HTML 等各种类型的数据。 **...

    hibernate的n+1问题.docx

    《理解Hibernate中的N+1问题及其解决方案》 在Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。然而,使用不当可能会导致性能瓶颈,其中最典型的就是“N+1次SELECT查询问题...

    浅谈Hibernate n+1问题

    浅谈Hibernate n+1问题 Hibernate 是一个基于Java的持久层框架,它提供了对数据库的访问和管理功能。在使用 Hibernate 进行数据访问时,经常会遇到一个问题,即 n+1 问题。该问题是指在一次数据库查询中,需要执行...

    useFetch:获取React的钩子

    useFetch 获取React的钩子安装npm install @ahmetelgun/usefetch用法import useFetch from "@ahmetelgun/usefetch" ;..const [ response , loading , error ] = useFetch ( "url" ) ;if ( loading ) { return &lt; div&gt;...

    0708 nuxt useFetch生产报错

    0708 nuxt useFetch生产报错

    1632 nuxt useFetch 生产报错

    1632 nuxt useFetch 生产报错

    1644 nuxt useFetch 生产报错

    1644 nuxt useFetch 生产报错

    1519 nuxt useFetch 生产报错

    1519 nuxt useFetch 生产报错

    1455 nuxt useFetch生产报错

    1455 nuxt useFetch生产报错

    0715nuxt useFetch生产报错

    0715nuxt useFetch生产报错

    Fetch+Promise教程

    Fetch+Promise教程 Fetch API 是一种现代化的网络请求方式,旨在取代传统的 XMLHttpRequest。它提供了许多优点,包括链式调用的语法、返回 Promise 等。Fetch API 的概念和用法、Headers 对象、Request 对象等都是...

    详解vue中使用express+fetch获取本地json文件

    ### 1. 创建Express服务器 在Vue项目中,我们首先需要创建一个Express服务器。在创建一个名为`back.js`的文件中,引入`express`库,并设置一个简单的服务器。这个服务器只有一个API接口,用于返回JSON数据: ```...

    how-to-use-fetch-api:此源代码展示了如何使用fetch API-Show source code

    在`how-to-use-fetch-api-master`源代码中,可能包含各种Fetch API的实战示例,如从API获取数据、上传文件、处理错误等。通过研究这些代码,可以更深入地理解Fetch API的实际应用。 总结,Fetch API是现代...

    useFetch

    这是一个用引导的项目。 入门 首先,运行开发服务器: npm run dev # or yarn dev 用浏览器打开以查看结果。 您可以通过修改pages/index.js来开始编辑页面。 页面在您编辑文件时自动更新。...要了解有关Next.js的更...

    Hibernate 1+N问题详解

    - 但同时也可能导致“N+1”问题,即除了主表查询外,还需要额外的查询来加载每个关联的子记录,这在子记录较多时可能会导致性能下降。 **2. FetchType.LAZY:** - `LAZY`加载方式则是延迟加载,即只有当真正访问到...

    Nhibernate分页

    **Nhibernate分页详解** Nhibernate是一款强大的对象关系映射(ORM)框架,它使得.NET开发者能够方便地在SQL数据库和.NET对象之间进行数据操作。在处理大量数据时,分页是必不可少的功能,它能有效地提高应用程序的...

    vue + element-ui+nodejs 商城管理系统源码.rar

    1、node-elm 商城后台系统,提供数据。 技术栈:nodejs + express + mongodb + mongoose + es6/7 + vue + element-ui 2、vue2-manage 商城后台系统前端,跟node-elm是配套的 技术栈:vue2 + vuex + vue-router + ...

Global site tag (gtag.js) - Google Analytics