【问题标题】:HQL: Querying dynamic-component propertyHQL:查询动态组件属性
【发布时间】:2010-01-04 12:10:36
【问题描述】:

如果我有这样的映射:

<class name="Library" table="Libraries">
  ...
  <dynamic-component name="Annotations">
    <property name="LibraryResolver.AlgorithmVersion" column="`LibraryResolver.AlgorithmVersion`" type="Int32" />
  </dynamic-component>
</class>

我应该如何为 LibraryResolver.AlgorithmVersion 大于给定值的所有库编写 HQL 或 Linq-to-NHibernate 查询?

【问题讨论】:

    标签: nhibernate hibernate hql


    【解决方案1】:

    下面的 HQL 查询可能与您正在寻找的行一致

    from Library as lib
    where lib.Annotations.LibraryResolver.AlgorithmVersion > 2
    

    如果您使用的是 nhibernate,您是否尝试过 NHibernate LambdaExtensions?该库提供了一组 Criteria 和 DetachedCriteria api 的扩展方法,在使用上述两个 api 进行查询时无需使用魔术字符串。

    下面是一个示例,说明如何将 NHibernate Detached Criteria 查询与上述 LambdaExtensions 库一起使用

    Answer answerAlias = null;
    var actual = DetachedCriteria.For<Survey>()
    .Add<Survey>( s => s.Status == SurveyStatus.Complete )
    .Add<Questionnaire>( q => q.Id == questionnaireId )
    .CreateAlias<Survey>( s => s.Answers, () => answerAlias )
    .SetProjection( LambdaProjection.Property( () => answerAlias.Id ) );
    

    【讨论】:

    • 有效吗?我确定我尝试了类似的查询,并且假设 AlgorithmVersion 是一个子属性。不幸的是,我系统中的 .NET 已损坏,这使我无法在剩下的一小时内尝试此操作,直到获得批准。 Lambda 扩展看起来很有趣。我尝试了 Linq-to-Nhibernate,但它未能创建合理的查询,但是扩展似乎提供了更直接的方法来构建查询。另一方面,我仍然不想从域服务中引用 NH。
    • 就我个人而言,我都使用过 HQL 和 Criteria/Detached Criteria。我建议您尝试一下 Lambda 扩展。它确实帮助我更快地掌握了 Criteria api。至于 HQL 语句在哪里工作或不工作,那将是你必须尝试的事情。但我很确定这将是一个很好的起点:)
    【解决方案2】:

    我不知道这是否有帮助,但是当我使用 Criteria API(Java 中)它就可以工作。虽然没有尝试过使用 HQL。

    <dynamic-component name="values">
            <property name="dynamicNameValue" column="ATTRIBUTE_1" type="string"/>
            <property name="dynamicNumber" column="ATTRIBUTE_4" type="integer"/>
    </dynamic-component>
    
    Criteria criteria = session.createCriteria(DynamicAttributes.class)
                    .add(Expression.eq("values.dynamicNumber", 2));
    

    只是想一想:问题可能是您传递的名称('LibraryResolver.AlgorithmVersion')包含一个点吗?也许发布一些您已经尝试过的代码?

    【讨论】:

    • 好的,我稍后会发布代码,但是我已经可以说你对这个名字是绝对正确的。在这种情况下不知道如何逃脱或使用它。 Criteria API 有效,但是这个查询是从一个甚至没有链接到 NHibernate 的库发出的,我想保持这种状态。
    猜你喜欢
    • 2016-04-21
    • 1970-01-01
    • 2012-12-29
    • 2016-10-07
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    • 2011-06-12
    相关资源
    最近更新 更多