【问题标题】:Hibernate Criteria API with access="field" mapping带有 access="field" 映射的 Hibernate Criteria API
【发布时间】:2013-04-02 08:03:56
【问题描述】:

我在使用 Hibernate Criteria API 时遇到问题:

var query = session.QueryOver<MyClass>().Where(param => param.Name == "myFilterName").List<MyClass>();

如果运行此语句,则抛出 NHibernate.QueryException:

无法解析属性:名称:MyClass

在 StackTrace 中:

在 NHibernate.Persister.Entity.AbstractPropertyMapping.ToType(String 属性名)

MyClass.hbm.xml 文件有这种方式映射的属性:

<property name="name" access="field">
  <column name="NAME" length="50" not-null="true" />
</property>

我认为问题的出现是因为 hibernate 无法访问 MyClass 的属性“Name”,因为它与 access="field" 映射,但由于应用程序设计要求,我无法更改这种访问属性的方式。 这个想法是通过使用 Criteria API 和 lambda 表达式来创建查询,以避免硬编码字符串属性名称。

我也尝试过使用具有相同异常结果的表达式:

var criterion = Expression.Where<MyClass>(param => param.Name == "myFilterName");
var result = session.CreateCriteria<MyClass>().Add(criterion).List<MyClass>();

有人知道我如何向 Criteria API 表明 MyClass 的属性映射为 access="field"

帮助非常感谢。

【问题讨论】:

    标签: nhibernate nhibernate-mapping nhibernate-criteria hbmxml


    【解决方案1】:

    不确定您想要实现什么,拥有类代码可能会有所帮助。

    无论如何,根据您提供的内容,我猜映射应该是:

    &lt;property name="Name" access="field.camelcase"&gt;

    http://www.nhforge.org/doc/nh/en/#mapping-declaration-property

    【讨论】:

    • 谢谢@jbl,我终于通过这个链接使用了这种方法:stackoverflow.com/questions/13943908/…>,但需要更改每个 hbm.xml 文件的所有属性名称(在我的情况下,我为每个文件使用一个 xml 文件实体)。另一种方法是在这种方式的类声明中只设置一次访问:
      default-access="field .camelcase" namespace="MyNamespace">
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2016-01-23
    • 1970-01-01
    • 2013-11-12
    • 2013-06-21
    • 1970-01-01
    相关资源
    最近更新 更多