三、NHibernate查询之HQL&Criteria

HQL与Criteria API详解
本文详细介绍了NHibernate Query Language (HQL) 的基本概念、关键语法及其应用场景,并对比了HQL与Criteria API的不同特点,适合希望深入了解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 customers;

        }

 

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 KeywordTest()

        {

            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>();

}

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/soldierluo/archive/2009/10/12/4657093.aspx

转载于:https://www.cnblogs.com/kingjiong/archive/2010/02/26/1674163.html

内容概要:本文介绍了基于贝叶斯优化的CNN-LSTM混合神经网络在时间序列预测中的应用,并提供了完整的Matlab代码实现。该模型结合了卷积神经网络(CNN)在特征提取方面的优势与长短期记忆网络(LSTM)在处理时序依赖问题上的强大能力,形成一种高效的混合预测架构。通过贝叶斯优化算法自动调参,提升了模型的预测精度与泛化能力,适用于风电、光伏、负荷、交通流等多种复杂非线性系统的预测任务。文中还展示了模型训练流程、参数优化机制及实际预测效果分析,突出其在科研与工程应用中的实用性。; 适合人群:具备一定机器学习基基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)础和Matlab编程经验的高校研究生、科研人员及从事预测建模的工程技术人员,尤其适合关注深度学习与智能优化算法结合应用的研究者。; 使用场景及目标:①解决各类时间序列预测问题,如能源出力预测、电力负荷预测、环境数据预测等;②学习如何将CNN-LSTM模型与贝叶斯优化相结合,提升模型性能;③掌握Matlab环境下深度学习模型搭建与超参数自动优化的技术路线。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注贝叶斯优化模块与混合神经网络结构的设计逻辑,通过调整数据集和参数加深对模型工作机制的理解,同时可将其框架迁移至其他预测场景中验证效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值