write down,forget
  • adidaseqt
  • eqtturbored
  • eqtsupport9317
  • eqtsupport
  • 9317adidas
  • adidaseqtboost9317
  • eqtsupport93
  • 9317eqt
  • eqt support 9317 adv
  • support 9317 adv
  • eqtadv
  • eqt9317
  • eqtadv9317
  • support93
  • originalseqt
  • adidas eqt
  • eqt support 9317
  • eqt support
  • eqt adv
  • eqt 9317
  • Nhibernate,“Antlr.Runtime.NoViableAltException”

    <Category: Nhibernate> 查看评论

    今天出现这个异常,记录下,“Antlr.Runtime.NoViableAltException”,出现这个异常,首先请检查你的HQL语句是否有语法错误

    另外贴一篇HQL,学习…
    From:http://www.cnblogs.com/lyj/archive/2008/10/15/1312089.html

    本节内容

    NHibernate中的查询方法
    NHibernate查询语言()
    1.from子句
    2.select子句
    3.where子句
    4.order by子句
    5.group by子句
    实例分析
    结语
    上一节,我们初步搭建了一个NHibernate程序,完成了映射Customer表并读取数据功能,这一节和下一节我们初步探讨一下在NHibernate中的查询方法。我这之前还是先回忆一下上一节完成的东西,其中一张图很多人回复说非常经典,简单明了!还是看着图。总结一下上一节三个重要的事情:建立数据库表—–编写持久化类—–编写映射文件,然后配置使用了。

    NHibernate中的查询方法

    在NHibernate中提供了很多查询方式给我们选择,这里仅仅列举了3种方式:NHibernate查询语言(HQL, Query Language)、条件查询(Criteria API,Query By Example(QBE)是Criteria API的一种特殊情况)、原生SQL(Literal SQL,T-SQL、PL/SQL)。每个人有不同的喜好和特长,可以根据自己的情况选择使用其中的一种或几种。这一节我们介绍NHibernate查询语言(HQL, Query Language)。

    NHibernate查询语言(HQL)

    NHibernate查询语言(HQL,NHibernate Query Language)是NHibernate特有的基于面向对象的SQL查询语言,它具有继承、多态和关联等特性。实际上是用OOP中的对象和属性映射了数据库中的表和列。

    例如这一句:select c.Firstname from Customer c

    Customer是数据库表,Firstname是列;而对于HQL:Customer是一个对象,Firstname是Customer对象的属性。相比之下SQL语句非常灵活,但是没有编译时语法验证支持。

    本节介绍基础语法:from子句,select子句,where子句,order by子句,group by子句并分别举出可以运行的实例。至于关联和连接,多态(polymorphism)查询,子查询在以后具体实例中学习。注意:HQL关键字不区分大小写。

    注意:由于篇幅有限,我在这里仅仅贴出了数据访问层的代码,就是在业务逻辑层可以直接调用的方法。测试这些方法的代码就没有贴出来了,你可以下载本系列的源代码仔细看看测试这些方法的代码。这节,我们在上一节源代码的基础上,在数据访问层中新建QueryHql.cs类用于编写HQL查询方法,在数据访问的测试层新建一QueryHqlFixture.cs类用于测试。

    1.from子句

    顾名思义,同SQL语句类似:

    1.简单用法:返回表中所有数据。

    public IList From()
    {
    //返回所有Customer类的实例
    return _session.CreateQuery(“from Customer”)
    .List();
    }
    2.使用别名:使用as来赋予表的别名,as可以省略。

    public IList FromAlias()
    {
    //返回所有Customer类的实例,Customer赋予了别名customer
    return _session.CreateQuery(“from Customer as customer”)
    .List();
    }
    3.笛卡尔积:出现多个类,或者分别使用别名,返回笛卡尔积或者称为“交叉”连接。

    2.select子句

    1.简单用法:在结果集中返回指定的对象和属性。

    public IList Select()
    {
    //返回所有Customer的CustomerId
    return _session.CreateQuery(“select c.CustomerId from Customer c”)
    .List();
    }
    2.数组:用Object[]的数组返回多个对象和/或多个属性,或者使用特殊的elements功能,注意一般要结合group by使用。注意,这里是Object[]的数组,我们可以定义DTO对象集合返回,即使用类型安全的.NET对象。

    public IList SelectObject()
    {
    return _session.CreateQuery(“select c.Firstname, count(c.Firstname) from Customer c group by c.Firstname”)
    .List();
    }
    3.统计函数:用Object[]的数组返回属性的统计函数的结果,注意统计函数的变量也可以是集合count( elements(c.CustomerId) ) 。注意,这里是Object[]的数组,我们可以定义DTO对象集合返回。

    public IList AggregateFunction()
    {
    return _session.CreateQuery(“select avg(c.CustomerId),sum(c.CustomerId),count(c) from Customer c”)
    .List();
    }
    4.Distinct用法:distinct和all关键字的用法和语义与SQL相同。实例:获取不同Customer的FirstName。

    public IList Distinct()
    {
    return _session.CreateQuery(“select distinct c.Firstname from Customer c”)
    .List();
    }
    3.where子句

    where子句让你缩小你要返回的实例的列表范围。

    public IList Where()
    {
    return _session.CreateQuery(“from Customer c where c.Firstname=’YJing'”)
    .List();
    }
    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
    4.order by子句

    按照任何返回的类或者组件的属性排序:asc升序、desc降序。

    public IList Orderby()
    {
    return _session.CreateQuery(“from Customer c order by c.Firstname asc,c.Lastname desc”)
    .List();
    }
    5.group by子句

    按照任何返回的类或者组件的属性进行分组。

    public IList Groupby()
    {
    return _session.CreateQuery(“select c.Firstname, count(c.Firstname) from Customer c group by c.Firstname”)
    .List();
    }
    实例分析

    好的,以上基本的查询的确非常简单,我们还是参考一下实例,分析一下我们如何写HQL查询吧!

    实例1:按照FirstName查询顾客:

    public IList GetCustomersByFirstname(string firstname)
    {
    //写法1
    //return _session.CreateQuery(“from Customer c where c.Firstname='” + firstname + “‘”)
    // .List();

    //写法2:位置型参数
    //return _session.CreateQuery(“from Customer c where c.Firstname=?”)
    // .SetString(0, firstname)
    // .List();

    //写法3:命名型参数(推荐)
    return _session.CreateQuery(“from Customer c where c.Firstname=:fn”)
    .SetString(“fn”, firstname)
    .List();
    }
    书写HQL参数有四种写法:

    写法1:可能会引起SQL注入,不要使用。
    写法2:ADO.NET风格的?参数,NHibernate的参数从0开始计数。
    写法3:命名参数用:name的形式在查询字符串中表示,这时IQuery接口把实际参数绑定到命名参数。
    写法4:命名的参数列表,把一些参数添加到一个集合列表中的形式,比如可以查询数据是否在这个集合列表中。
    使用命名参数有一些好处:命名参数不依赖于它们在查询字符串中出现的顺序;在同一个查询中可以使用多次;它们的可读性好。所以在书写HQL使用参数的时候推荐命名型参数形式。

    测试一下这个方法吧:看看数据库中Firstname为“YJingLee”的记录个数是否是1条,并可以判断查询出来的数据的FirstName属性是不是“YJingLee”。

    [Test]
    public void GetCustomerByFirstnameTest()
    {
    IList customers = _queryHQL.GetCustomersByFirstname(“YJingLee”);
    Assert.AreEqual(1, customers.Count);
    foreach (var c in customers)
    {
    Assert.AreEqual(“YJingLee”, c.Firstname);
    }
    }
    实例2:获取顾客ID大于CustomerId的顾客:

    public IList GetCustomersWithCustomerIdGreaterThan(int customerId)
    {
    return _session.CreateQuery(“select from Customer c where c.CustomerId > :cid”)
    .SetInt32(“cid”, customerId)
    .List();
    }
    结语

    在这篇文章中,我们了解了NHibernate其中的一种查询语言HQL,这些实例我争取写出来可以运行起来,大家下载源码看看效果,一些数据需要按个人情况修改。例如查询条件结果。下一节继续介绍另外一种查询语言!注意,这篇有的是返回IList类型,在实际项目中不可能使用这个类型,我们需要使用一个对象,就是一个DTO转换返回IList类型。

    本文来自: Nhibernate,“Antlr.Runtime.NoViableAltException”

    

    只有 1 条评论 订阅该文评论 RSS

    cam boys

    Standing suddenly as if the sudden movement could wipe away the memory she walked into the bathroom, gleaming white tiles surrounding her, clinical and clean and breathing in the gentle scent of sandalwood and lemon she sat on the side of the bath and cried.

    eqt support adidas eqt support 93 primeknit og colorway ba7506 adidas eqt running 93 updated with primeknit construction adidas eqt boost 93 17 white turbo red adidas eqt support 9317 white turbo red adidas eqt support 93 17 adidas eqt support 9317 adidas eqt support 9317 turbo red releases tomorrow adidas originals adidas eqt tactile green pack adidas eqt tactile green pack adidas eqt light green pack womens adidas eqt light green pack coming soon adidas eqt milled leather pack release date adidas originals eqt milled leather pack adidas eqt support ultra boost turbo red white adidas adv support burnt orange grey where to buy the adidas eqt support 9317 turbo red adidas eqt boost 91 16 turbo red adidas eqt support 93 turbo red adidas eqt support 9317 white turbo red available now