0
使用Active Record/NHibernate,我试图选择具有多个子集合的实体(站点)。选择具有多个子实体的实体
只有一个站点具有给定的siteId,但FindAll返回站点28次;它正在复制,因为它正在加载的子集合。我如何获得它只加载1个站点和子集合的数组?我不介意它是否有5个选择,其中一个可以抓取该网站,然后每个儿童收集1个。
下面是代码:
var criteria = DetachedCriteria.For<Site>()
.CreateAlias("TimeZone", "tz", NHibernate.SqlCommand.JoinType.InnerJoin)
.CreateAlias("Logos", "l", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.CreateAlias("SiteColors", "sc", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.CreateAlias("ManagerUsers", "mu", NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.Add(Restrictions.Eq("Id", siteId));
var sites = FindAll(criteria);
我要指出,我还用获取尝试过的HQL方法,但取不取!它只返回一个Site(好),但没有任何一个孩子集合被急切加载(坏)。
public static Site Get(int id)
{
var query = new SimpleQuery<Site>(@"
from Site s
where s.Id = ?
inner join fetch s.TimeZone tc
left join fetch s.Logos l
left join fetch s.SiteColors sc
left join fetch s.ManagerUsers mu
", id);
var results = query.Execute().ToList();
return results.FirstOrDefault();
}
这里是代码,似乎工作,用“未来”的方法:
public static Site Get(int id)
{
var session = ActiveRecordMediator.GetSessionFactoryHolder().CreateSession(typeof(Site));
var query = session.CreateQuery("from Site s left join fetch s.Logos where s.Id = :id").SetParameter("id", id).Future<Site>();
session.CreateQuery("from Site s left join fetch s.SiteColors where s.Id = :id2").SetParameter("id2", id).Future<Site>();
session.CreateQuery("from Site s left join fetch s.ManagerUsers where s.Id = :id3").SetParameter("id3", id).Future<Site>();
return query.FirstOrDefault();
}
我所有的数据模型类的从SimpleModel类,我添加的Equals和GetHashCode方法继承到:
public abstract class SimpleModel
{
protected SimpleModel()
{
DateCreated = DateTimeAccess.Now;
}
[PrimaryKey]
[DocumentId]
public virtual int Id { get; set; }
[Property]
public virtual DateTime DateCreated { get; set; }
public override bool Equals(object obj)
{
if (obj is SimpleModel)
{
return Id.Equals(((SimpleModel)obj).Id);
}
else
{
return false;
}
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
}
感谢@Mauricio。使用SetResultTransformer或创建新会话并使用Future方法来加入多个查询,哪种方法更好? – Justin 2011-05-14 15:14:19
这种方法似乎并不奏效,它迫使那里只有一个根实体,这很棒,但是它复制了子实体。例如,我的一个子集合应该有21个对象,而现在有31个。 – Justin 2011-05-14 15:23:35
@Justin:确保你已经正确实现了GetHashCode()和Equals() – 2011-05-14 15:31:09