【问题标题】:Creating a "where in" HQL query创建“在哪里”HQL 查询
【发布时间】:2011-11-04 11:40:48
【问题描述】:

我在编写使用“where in”子句的 HQL 查询时遇到问题。

简化的类如下所示:

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);
}

我想获取属于某些Parent 项目的Child 实例,所以我编写了以下代码:

// 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 收到以下异常:

测试方法 Can_get_children_for_many_parents 抛出异常: NHibernate.PropertyAccessException: Some.Namespace.Parent.Id 发生异常 ---> System.Reflection.TargetException:对象与目标类型不匹配。

[编辑]

我尝试使用q.SetParameter("parents", parents.Select(p =&gt; p.Id);,但我得到了同样的异常。

【问题讨论】:

    标签: c# nhibernate hql where-in


    【解决方案1】:

    试试这样的:

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

    【讨论】:

    • +1,谢谢,我刚刚在this thread 找到它。 parents 在我的例子中是 IEnumerable&lt;Parent&gt; 类型。
    • +1 表示 SetParameterList,但为什么是 parents.Split 而不是 parents.ToArray()??
    • @stefan:这是我使用的代码的一部分。我猜结果是一样的(假设数据总是正确的)
    猜你喜欢
    • 2010-12-18
    • 2012-02-19
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多