NHibernate QuerySyntaxException

Существуют операторы для выполнения implicit и explicit пользовательское преобразование типов между заявленным классом и одним или несколькими произвольными классами. implicit оператор эффективно позволяет моделирование перегрузки assignement оператора, который возможен на языках, таких как C++, но не C#.

Это, кажется, не функция, через которую каждый приезжает очень часто, но это на самом деле используется в LINQ к библиотеке XML (System.Xml.Linq), где можно неявно преобразовать строки в XName объекты. Пример:

XName tagName = "x:Name";

я обнаружил эту функцию в этом статья о том, как моделировать множественное наследование в C#.

11
задан ahsteele 4 August 2009 в 15:22
поделиться

2 ответа

Я также следил за Summer of NHibernate Screencast Series и наткнулся на та же проблема.

Проблема заключается в HQL « выберите из пользователя p » измените это на « выберите p из пользователя p » или просто « из пользователя p ».

« Сокращенная »форма HQL, которая использовалась в скринкастах в NHibernate версии 1.2, была устаревшей в 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>();
}
18
ответ дан 3 December 2019 в 04:53
поделиться

Поскольку вы указываете пространство имен в элементе , вы можете написать:

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

После того, как вы попробуете это, если это не сработает - Понятия не имею, почему это не работает. Я пробовал в значительной степени приведенный вами пример, и он сработал.

Я видел, как новый синтаксический анализатор выдает несколько странных ошибок, и вам просто нужно использовать метод проб и ошибок, когда это происходит: (.

Edit

О методе проб и ошибок: вы можете изменить запрос на "from Person" и посмотреть, работает ли это (если нет ... я застрял). Затем добавьте фильтр, сначала попробуйте напрямую p.FirstName = 'x' . Затем попробуйте с параметром. Вы можете попробовать не добавлять псевдоним.

Также попробуйте использовать последнюю версию NH.

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

Работает как шарм.

5
ответ дан 3 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: