如何存在<any>关联</any>时如何编写Criteria Query

时间:2010-04-30 04:34:42

标签: nhibernate criteria

我在构建正确的标准以进行特定查询时遇到一些麻烦 - 经过与谷歌教授的一个下午咨询后,我希望有人可以指出我正确的方向。

我有两个感兴趣的实体:OutputTsDefNamedAttribute

我要做的是查找具有特定OutputTsDef值的所有NamedAttribute

我可以编写一个独立的条件来查找所有NamedAttributes 给定的名称和价值:

       var attributesCriteria
           = DetachedCriteria.For<INamedAttribute>()
               .Add(Expression.Eq("Name", "some name"))
               .Add(Expression.Eq("Value", "some value"));

如何将此注入到OutputTsDef的查询中以限制结果?

       var criteria
           = nHibernateSession.CreateCriteria(typeof(IOutputTsDefEntity));
       // What do I write here?
       var results = criteria.List();

NamedAttribute看起来像这样 - 请注意我们可以使用的[Any] 关于多种实体的NamedAttributes

[AttributeIdentifier("DbKey", Name = "Id.Column", Value = "NamedAttributeID")]
[Class(Table = "NamedAttributes")]
public class NamedAttribute : BusinessEntity, INamedAttribute
{
    [Any(0, Name = "Entity", MetaType = "System.String", IdType = "System.Int32")]
    [MetaValue(1, Class = "Sample.OutputTsDef, Sample.Entities", Value = "OTD")]
    [MetaValue(2, Class = "Sample.OutputTimeSeriesAttributesEntity, Sample.Entities", Value = "OTA")]
    [Column(3, Name = "OwnerType")]
    [Column(4, Name = "OwnerKey")]
    public virtual IBusinessEntity Entity { get; set; }

   [Property(Column = "Name")]
   public virtual string Name { get; set; }

   [Property(Column = "Value")]
   public virtual string Value { get; set; }

   ... omitted ...

}

在常规SQL中,我只需要包含一个额外的“where”子句:

where OutputTsDefId
      in ( select distinct OwnerKey
           from NamedAttributes
           where Name = ?
             and Value = ?
             and OwnerType = 'OTD' )

我错过了什么?

(问题也发布在NHUsers邮件列表中 - 我会在这里复制任何有用的信息。)

2 个答案:

答案 0 :(得分:0)

this apparently similar hibernate question的答案有帮助吗?

答案 1 :(得分:0)

这就是我最终做的事情 - 以这种方式嵌入SQL子查询检查:

const string subquery
    = "{alias}.OutputTsDefId in "
        +"( select OwnerKey "
        + " from NamedAttributes na "
        + " where na.Name = ? and na.Value = ? and OwnerType='OTD')";
criteria.Add(
    Expression.Sql(
        subquery,
        new object[] { attributeFilter.Name, attributeFilter.Value },
        new IType[] { NHibernateUtil.String, NHibernateUtil.String }));

这不太理想 - 我真的不喜欢以这种方式穿过NHibernate。但是,它完成了工作,这很重要。

我仍然有兴趣找到一个纯粹的NHibernate解决方案,如果有的话。