首页 > 其他分享 >三、NHibernate查询之HQL&Criteria

三、NHibernate查询之HQL&Criteria

时间:2022-12-08 11:06:33浏览次数:54  
标签:csm Customer return List session IList Criteria HQL NHibernate


一、什么是HQL(NHibernate Query Language)查询语言

Ø    定义:NHibernate查询语言(HQL,NHibernate Query Language)是NHibernate特有的基于面向对象的SQL查询语言,它具有继承、多态和关联等特性。

Ø    它如何运行:HQL查询的是通过ORM模式映射出来的类,然后再根据映射文件和hibernate.cfg.xml文件,动态生成SQL语句到数据库中执行。

Ø    注意事项:因为HQL中查询的表和字段实际是映射而来的类和其属性,所以这些表和字段是区分大小写的,但是HQL关键字不区分大小写,这点请特别注意。

Ø    优点:如果进行了数据库的迁移,只需要修改Hibernate.cfg.xml和映射文件即可,这是我的理解,但感觉这个优点并不明显。

 

二、HQL关键字及其用法

在DAL的NHibernateSample中添加以下各个函数

1)       from和as

  

//使用IList<>返回多行数据
public IList<Customer> fromAndAs()
{ //当返回为类的实例时,不需要select;as关键字可以省略;返回为多行时使用List ()函数
IList<Customer> customers = session.CreateQuery("from Customer csm").List<Customer>();
return
}

2)       select

     

public IList<int> Select()
{
return session.CreateQuery("select csm.CustomerId from Customer csm").List<int>();
}

 

3)       select和group by

      

public IList<object[]> SelectObjectAndGroupBy()
{
return session.CreateQuery("select csm.Firstname, count(*) from Customer csm group by csm.Firstname").List<object[]>();
}

4)       distinct

    

public IList<string> Distinct()
{
return session.CreateQuery("select distinct csm.Firstname from Customer csm").List<string>();
}

 

5)       where

     

public IList<Customer> Where()
{
//return session.CreateQuery("from Customer csm where csm.FirstName='luo'").List<Customer>();
//下面为参数化写法,可读性好、条理清晰、安全,推荐使用
return session.CreateQuery("from Customer csm where csm.Firstname=:fn")
.SetString("fn", "luo")
.List<Customer>();
}

下面是where子句允许出现的表达式包括了在SQL中的大多数情况:

Ø         数学操作符:+, -, *, /

Ø         真假比较操作符:=, >=, <=, <>, !=, like

Ø         逻辑操作符:and, or, not

Ø         字符串连接操作符:||  

Ø         SQL标量函数:upper(),lower()

Ø         没有前缀的( ):表示分组

Ø         in, between, is null

Ø         位置参数:?

Ø         命名参数::name, :start_date, :x1

Ø         SQL文字:'foo', 69, '1970-01-01 10:00:01.0'

Ø         枚举值或常量:Color.Tabby 

 

6)       order by

public IList<Customer> OrderBy()
{
return session.CreateQuery("from Customer csm order by csm.CustomerId desc").List<Customer>();
}

 

三、测试

添加如下代码到DAL.Test的NHibernateSampleTest.cs中,然后使用调试方法测试运行,跟踪结果是否正确

    

[Test]
public void
{
IList<Customer> values = sample.fromAndAs();
//IList<int> values = sample.Select();
//IList<object[]> values = sample.SelectObjectAndGroupBy();
//IList<string> values = sample.Distinct();
//IList<Customer> values = sample.Where();
//IList<Customer> values = sample.OrderBy();
}

 

五、条件查询(Criteria Query)

HQL极为强大,但是有些人希望能够动态的使用一种面向对象API创建查询,而不是在.NET代码中嵌入字符串。在NHibernate中,提供了一种直观的、可扩展的Criteria API。在我们键入查询语句的时候,提供了编译时的语法检查,VS提供了强大的智能提示。如果你对HQL的语法感觉不是很舒服的话,用这种方法可能更容易。这种API也比HQL更可扩展。

 

典型用法:从ISession接口中创建ICriteria实例对象;在这个ICriteria实例对象上设置一个或多个表达式;要求ICriteria接口返回需要的列表,就是根据表达式从数据库中返回对象。

 

六、创建ICriteria实例

使用ISession接口的CreateCriteria方法创建了NHibernate.ICriteria接口一个特定的持久化类的查询实例,也可以说ISession是用来制造Criteria实例的工厂。

public IList<Customer> CreateCriteria()
{
ICriteria crit = _session.CreateCriteria(typeof(Customer));
crit.SetMaxResults(50);
IList<Customer> customers = crit.List<Customer>();
return customers;
}

 

七、结果集限制

使用ICriteria接口提供的Add方法添加Restrictions类中约束表达式可以限制一些结果集的作用。

 

public IList<Customer> Narrowing()
{
IList<Customer> customers = _session.CreateCriteria(typeof(Customer))
.Add(Restrictions.Like("Firstname", "YJing%"))
.Add(Restrictions.Between("Lastname", "A%", "Y%"))
.List<Customer>();
return customers;
}

 

八、结果集排序

使用ICriteria.Order对结果集排序,第二个参数true代表asc,false代表desc。例如下面例子查询Customer对象按FirstName降序、Lastname升序。

 

public IList<Customer> Order()
{
return _session.CreateCriteria(typeof(Customer))
.Add(Restrictions.Like("Firstname","Y%"))
.AddOrder(new NHibernate.Criterion.Order("Firstname", false))
.AddOrder(new NHibernate.Criterion.Order("Lastname", true))
.List<Customer>();
}

标签:csm,Customer,return,List,session,IList,Criteria,HQL,NHibernate
From: https://blog.51cto.com/u_15906220/5920730

相关文章

  • 二、第一个NHibernate程序
    一、准备要运行第一个NHibernate程序需要两个额外的DLL和两个xsd文件,他们可以在从官网上下载的文件里找到,DLL分别是NHibernate.dll和NHibernate.ByteCode.Castle.dll,xsd文件......
  • 八、NHibernate关系之——多对多
    多对多关系​废话不多说,看图:这里我们主要是要解决Order表和Product表之间的多对多的关系,相信有过数据库设计经验的人是很容易理解的,OrderProduct是一个关系表,而Order和Produ......
  • NHibernate学习笔记
    NHibernate学习笔记 一、         什么是NHibernate、为什么要用它及相关资源 二、         第一个NHibernate程序 三、         NHibern......
  • 十三、NHibernate之对象状态
     引入​在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象。这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的,为了区分......
  • 十二、NHibernate之SchemaExport工具
    说明​使用领域驱动开发,我觉得还不太实际,或者说对于我来说条件还不成熟,因为我对NHibernate还不太熟悉,就现时来说,使用数据库驱动开发还是最好的选择,所以,我这里暂时先不管Sche......
  • Spring for GraphQL入门教程(二)
    5.带注释的控制者SpringforGraphQL提供了一个基于注释的编程模型,其中组件使用注释来声明具有灵活方法签名的处理程序方法获取特定GraphQL字段的数据。例如:​​@Contr......
  • Spring for GraphQL入门
    1.概述SpringforGraphQL为基于GraphQLJava 构建的Spring应用程序提供支持。这是GraphQLJava团队和Spring工程。SpringforGraphQL是GraphQLJavaSpring项目......
  • Hibernate的hql语句多种返回结果示例
    返回单个对象publicstaticvoidtest1(){Sessionsession=SessionFactoryUtils.openSession();Transactiontransaction=session.beginTransaction();St......
  • HQL数据查询基础(一)
    源自imooc的学习      什么是HQL呢?      HQL是HibernateQueryLanguage,Hibernate查询语言;同时HQL是一种面向对象的查询语言,HQL查询的主体是映射配置的......
  • Spring boot中apollo-kotlin基本使用(一个客户端使用多个graphql端点)
    apollo-kotlin一、新建Springboot项目.├──build.gradle.kts└──src├──main│  ├──graphql│  │  ├──service1│ ......