【问题标题】:A correct way to load entities by Id list when Id is not mapped未映射 Id 时按 Id 列表加载实体的正确方法
【发布时间】:2009-10-17 23:42:13
【问题描述】:

我有以下代码

string idName = builder.IdentifierName;
Disjunction disjunction = Restrictions.Disjunction();
IList ids = new ArrayList(entityInfos.Length);
foreach (var entityInfo in entityInfos)
{
    ids.Add(entityInfo .Id);
}
disjunction.Add(Restrictions.In(idName, ids));
criteria.Add(disjunction);
criteria.List();

(我没写,是NHibernate.Search的简化代码)

idName 的值是正确的 ("Id")。

在我的映射中,我没有将 Id 映射到实体属性,它只是 DB:

<id column="Id" type="int">
  <generator class="native" />
</id>

当我运行代码时,它会抛出异常:

[QueryException: could not resolve property: Id of: MyType]
   NHibernate.Persister.Entity.AbstractPropertyMapping.ToType(String propertyName) +326
   NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetTypeUsingProjection(ICriteria subcriteria, String propertyName) +416
   NHibernate.Criterion.InExpression.AssertPropertyIsNotCollection(ICriteriaQuery criteriaQuery, ICriteria criteria) +41
   NHibernate.Criterion.InExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) +49
   NHibernate.Criterion.Junction.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) +448
   NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary`2 enabledFilters) +354
   NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, ICriteria criteria, String rootEntityName, IDictionary`2 enabledFilters) +516
   NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary`2 enabledFilters) +220
   NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) +364
   NHibernate.Impl.CriteriaImpl.List(IList results) +63
   NHibernate.Impl.CriteriaImpl.List() +46

创建限制和条件以便我可以通过Id 进行搜索(即使它没有映射)的正确方法是什么?

【问题讨论】:

    标签: nhibernate nhibernate-mapping criteria nhibernate.search


    【解决方案1】:

    改用IdEq。它需要另一个析取。

    Disjunction idsRestriction = Restrictions.Disjunction();
    entityInfo
      .Select(x => x.Id)
      .ToList()
      .ForEach(id => idsRestriction.Add(Restriction.IdEq(id)));
    disjunction.Add(idsRestriction);
    

    注意:这将产生类似(id = 1 OR id = 2 OR id = 3 ...) 而不是(id IN (1, 2, 3)

    不确定它是否有效,但应该。

    【讨论】:

      【解决方案2】:

      可以使用IdEq,也可以使用关键字“id”(全小写)来指代主键

      【讨论】:

        猜你喜欢
        • 2016-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-27
        • 1970-01-01
        • 2018-12-08
        • 1970-01-01
        相关资源
        最近更新 更多