2009-08-04 6 views
11

私はSummer of NHibernate Screencast Seriesと一緒に従っており、奇妙なNHibernate Exceptionを実行しています。NHibernate QuerySyntaxException

NHibernate.Hql.Ast.ANTLR.QuerySyntaxException: 
Exception of type 
'Antlr.Runtime.NoViableAltException' was thrown. 
[select from DataTransfer.Person p where p.FirstName=:fn]. 

私は、次の方法でスクリーンキャストシリーズから外れています

  1. 私が代わりに私MbUnitので

MSTestをを使用していますMS SQL Server Compactのデータベースに対して実行常に同じ結果のクエリの組み合わせをいくつでも試してみました。私の存在から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>(); 
} 

ない直接のクエリは、この方法は

public Person GetPersonById(int personId) 
{ 
    ISession session = GetSession(); 
    return session.Get<Person>(personId); 
} 

マイ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> 

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> 

答えて

18

私はSummer of NHibernate Screencast Seriesにも従っていて、同じ問題を抱えていました。

問題は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>(); 
} 
5

あなたは<hibernate-mapping要素に名前空間を指定しているので、あなたが書くことができる:

<class name="Person" table="Person"> 
    .... 

それが動作しない場合は、以下のことをしようとした後 - 私はそれが機能しない理由はわかりません。私はあなたが与えた例をかなり試してみました。私は新しいパーサはいくつかの奇妙なエラーを投げる見ていると、あなたはちょうどそれが:(起こるとき、試行錯誤で行かなければならない

編集

に試行錯誤について:あなたは変更される可能性が"from Person"へのクエリは、それが動作するかどうかを確認します(そうでなければ...私はスタックしています)。次にフィルタを追加して、まず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> 

とクエリ:

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

が魅力のように働きました。

+0

は無駄に* Person.hbm.xml *への変更を行いました。試行錯誤は奇妙なNHibernateパーサーエラーを処理する方法であると示していますが、どのような試行が必要ですか? – ahsteele

+0

「DataTransfer.Person pから選択」し、同じエラーが発生しました。私はNHibernateのビルド2.1.0を使用しています。 MS SQL Server Compact Databaseを使用していますか?私たちの仕事の間に見ることができる唯一の他の違いは、あなたが* User.hbm.xml *のNHibernateTestsアセンブリについてより明白であるということです。他の考え? – ahsteele

+1

あなたは "Personから"(それはhqlで合法です)という選択を終了しようとしましたか?私は実際にsqliteに対してテストしていますが、antlrパーサーがクエリを生成するように動作するため、データベースが問題であった場合は問題ありません。 – sirrocco