Tôi đang theo dõi cùng với Summer of NHibernate Screencast Series và đang chạy vào Ngoại lệ NHibernate lạ.NHibernate QuerySyntaxException
NHibernate.Hql.Ast.ANTLR.QuerySyntaxException:
Exception of type
'Antlr.Runtime.NoViableAltException' was thrown.
[select from DataTransfer.Person p where p.FirstName=:fn].
Tôi đã chệch khỏi các Screencast Series trong các cách sau:
- Chạy chống lại một cơ sở dữ liệu nhỏ gọn MS SQL Server
- Tôi đang sử dụng MSTest thay vì MbUnit
tôi đã thử mọi kết hợp truy vấn luôn với cùng một kết quả. cú pháp CreateQuery hiện tại của tôi
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>();
}
Trong khi không phải là một truy vấn trực tiếp Phương pháp này hoạt động
public Person GetPersonById(int personId)
{
ISession session = GetSession();
return session.Get<Person>(personId);
}
My 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>
Thực hiện thay đổi thành * Person.hbm.xml * thành không có. Bạn chỉ ra rằng dùng thử và lỗi là một cách để làm việc thông qua các lỗi phân tích cú pháp NHibernate lạ, tôi nên làm những loại thử nghiệm nào? – ahsteele
Thay đổi chọn đơn giản là "chọn từ DataTransfer.Person p" và nhận được lỗi tương tự. Tôi đang sử dụng Build 2.1.0 của NHibernate. Bạn đang sử dụng MS SQL Server Compact Database? Sự khác biệt duy nhất tôi có thể thấy giữa công việc của chúng tôi là bạn đang được rõ ràng hơn về lắp ráp NHibernateTests trong * User.hbm.xml *. Suy nghĩ khác? – ahsteele
bạn đã thử để lại lựa chọn chỉ: "từ người" (đó là hợp pháp trong hql)? Tôi thực sự thử nghiệm đối với sqlite nhưng tôi nghi ngờ nó quan trọng khi trình phân tích cú pháp antlr hoạt động hướng tới việc tạo truy vấn và nếu cơ sở dữ liệu là vấn đề bạn sẽ nhận được một sqlexception – sirrocco