Создание HQL-запроса "где в" - PullRequest
       9

Создание HQL-запроса "где в"

3 голосов
/ 26 августа 2011

У меня возникают проблемы при написании HQL-запроса, в котором используется предложение where.

Упрощенные классы выглядят так:

class Parent
{
    public virtual Int64 Id { get; private set; }
    public virtual string Name { get; private set; }
}

class Child
{
    public virtual Int64 Id { get; private set; }
    public virtual string Name { get; private set; }
    public virtual Parent Parent { get; private set; }
}

С отображением, определенным так:

class ParentMap : ClassMap<Parent>
{
    Id(x => x.Id);
    Map(x => x.Name);
}

class ChildMap : ClassMap<Child>
{
    Id(x => x.Id);
    Map(x => x.Name);
    References(x => x.Parent);
}

Я хотел получить Child экземпляров, которые принадлежат определенным Parent элементам, поэтому я написал следующий код:

// get children for several parents (a flattened list)
IEnumerable<Parent> parents = GetParents();

// use hql
IQuery q = Session.CreateQuery("from Child as c where c.Parent in (:parents)");
q.SetParameter("parents", parents);

, но проблема в том, что я получаю следующее исключениев q.SetParameter:

Test method Can_get_children_for_many_parents threw exception:
  NHibernate.PropertyAccessException:
  Exception occurred getter of Some.Namespace.Parent.Id 
  ---> System.Reflection.TargetException: Object does not match target type.

[Изменить]

Я пытался использовать q.SetParameter("parents", parents.Select(p => p.Id);, но получаю то же исключение.

1 Ответ

6 голосов
/ 26 августа 2011

Попробуйте что-то вроде этого:

q.SetParameterList("parents", parents.ToList());
...