所有
我有一个实体,它有几个集合, - 每个集合都是懒惰映射的。当我运行条件查询时,我在结果集中获得了我的根实体的重复结果。当我的所有收藏品被懒惰地映射时,这怎么可能!
我验证了,我的藏品,懒洋洋地加载。
这是我的映射:
根实体'项目':
[Bag(0, Lazy = CollectionLazy.True, Inverse = true, Cascade = "all-delete-orphan")]
[Key(1, Column = "job_id")]
[OneToMany(2, ClassType = typeof(ProjectPlan))]
public virtual IList<ProjectPlan> PlanList
{
get { return _planList; }
set { _planList = value; }
}
标准查询是:
ICriteria criteria = session.Session.CreateCriteria<Entities.Project>()
.Add(Restrictions.Eq(Entities.Project.PROP_STATUS, !Entities.Project.STATUS_DELETED_FLAG));
.CreateAlias(Entities.Project.PROP_PLANLIST, "p")
.Add(Restrictions.Eq("p.County", 'MIDDLSEX'))
.setFirstResult(start).setMaxResults(pageSize)
.List<Entities.Project>();
我知道,我可以纠正这个问题w / Distinct结果转换器,我只是想知道这是否是懒惰集合的正常行为。
编辑:我找到了原因, - 在查看原始SQL,连接和where子句是正确的时候,但令我困惑的是生成的Select子句, - 它不仅包含项目实体的列(root)实体)以及项目计划实体的列,这些列导致我上面描述的问题。我现在不在工作,但我会尝试这样做:.SetProjection(Projections.RootEntity()),所以我只在select子句中获得Project的列。答案 0 :(得分:1)
一种方法,如何解决这个(我会说这么常见的情况)是:1)不使用查询内部的提取集合和2)使用批量提取,作为一部分映射
因此,我们将始终查询根实体。这将为我们提供一个平坦的结果集,可以正确用于分页。
要获取每个收到的行的收集数据,并避免1 + N问题(收集每条记录的goign),我们将使用19.1.5. Using batch fetching
映射就像这样
[Bag(0, Lazy = CollectionLazy.True
, Inverse = true
, Cascade = "all-delete-orphan"
, BatchSize = 25)] // Or something similar to batch-size="25"
[Key(1, Column = "job_id")]
[OneToMany(2, ClassType = typeof(ProjectPlan))]
public virtual IList<ProjectPlan> PlanList
{
...
其他一些类似的QA (具有几乎相同的细节)
我们仍然可以过滤而不是收藏品!但我们必须使用子查询,例如Query on HasMany reference