NHibernate QuerySyntaxException

ahs*_*ele 11 nhibernate exception

我正在关注NHibernate Screencast系列夏天,我遇到了一个奇怪的NHibernate Exception.

NHibernate.Hql.Ast.ANTLR.QuerySyntaxException:
Exception of type
'Antlr.Runtime.NoViableAltException' was thrown.
[select from DataTransfer.Person p where p.FirstName=:fn].
Run Code Online (Sandbox Code Playgroud)

我通过以下方式偏离了Screencast系列:

  1. 针对MS SQL Server Compact数据库运行
  2. 我使用的是MSTest而不是MbUnit

我已经尝试了任何数量的查询组合,总是具有相同的结果.我目前的CreateQuery语法

public IList<Person> GetPersonsByFirstName(string firstName)
{
    ISession session = GetSession();

    return session.CreateQuery("select from Person p " +
        "where p.FirstName=:fn").SetString("fn", firstName)
        .List<Person>();
}
Run Code Online (Sandbox Code Playgroud)

虽然不是直接查询,但此方法有效

public Person GetPersonById(int personId)
{
    ISession session = GetSession();
    return session.Get<Person>(personId);
}
Run Code Online (Sandbox Code Playgroud)

我的hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory name="BookDb">
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlServerCeDriver</property>
    <property name="dialect">NHibernate.Dialect.MsSqlCeDialect</property>
    <property name="connection.connection_string">Data Source=C:\Code\BookCollection\DataAccessLayer\BookCollectionDb.sdf</property>
    <property name="show_sql">true</property>
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
    <mapping assembly="DataTransfer"/>
  </session-factory>
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)

Person.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DataTransfer" namespace="DataTransfer">
  <class name="DataTransfer.Person,DataTransfer" table="Person">
    <id name="PersonId" column="PersonId" type="Int32" unsaved-value="0">
      <generator class="native"/>
    </id>
    <property name="FirstName" column="FirstName" type="String" length="50" not-null="false" />
    <property name="LastName" column="LastName" type="String" length="50" not-null="false" />
  </class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

Ley*_*eyu 18

我也在关注NHibernate Screencast系列夏天,并遇到了同样的问题.

问题在于HQL" 从用户p中选择 "更改为" 从用户p中选择p "或" 从用户p中选择 ".

在NHibernate 1.2版下的截屏视频中使用的"速记"HQL表单在2.0 中已弃用,并在2.1.x中被删除,因为默认查询解析器被更换为更严格的选项.

public IList<Person> GetPersonsByFirstName(string firstName)
{
    ISession session = GetSession();

    return session.CreateQuery("select p from Person p where p.FirstName=:fn")
                              .SetString("fn", firstName)
                              .List<Person>();
}
Run Code Online (Sandbox Code Playgroud)


sir*_*cco 5

由于您在<hibernate-mapping元素中指定了命名空间,因此您可以编写:

 <class name="Person" table="Person">
  ....
Run Code Online (Sandbox Code Playgroud)

尝试之后,如果它不起作用 - 我不知道它为什么不起作用.我已经尝试了你给出的几乎所有的例子.

我已经看到新的解析器抛出了一些奇怪的错误,你只需要在它发生的时候通过反复试验:(.

编辑

关于试验和错误:您可以将查询更改为"来自人",看看是否有效(如果它没有...我被卡住了).然后添加过滤器,首先直接尝试p.FirstName ='x'.然后尝试使用参数.您可以尝试不添加别名.

此外,尝试使用最新版本的NH.

编辑2

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateTests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" namespace="NHibernateTests">

<class name="User" table="`User`" xmlns="urn:nhibernate-mapping-2.2">
<id name="Id" type="Int32" column="UserId">
  <generator class="assigned" />
</id>
<property name="UserName" type="String">
  <column name="UserName" not-null="true" />
</property>
<property name="FName" type="String">
  <column name="FName" />
</property>
  </class></hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)

和查询:

IList<User> users = session.CreateQuery("select from User p " +
                              "where p.UserName=:fn").SetString("fn", "u")
                  .List<User>();
Run Code Online (Sandbox Code Playgroud)

工作就像一个魅力.