我必须使用Nhibernate(3.3)维护/支持源代码。 在一个地方(统计处理)我必须加载在图像上表示作业的实体,最终图像在DB中的Blob中:
_dbSess = NHibernateHelper.GetCurrentSession();
IQuery dbQuery = _dbSess.GetNamedQuery("GetReadyClientFilesForOper");
dbQuery.SetString("operId", UserId);
dbQuery.SetDateTime("fdate", from);
dbQuery.SetDateTime("tdate", to);
cltFiles = dbQuery.List<ClientFile>();
查询是:
query name="GetReadyClientFilesForOper"
![CDATA[select clt from ClientFile clt where (clt.Status = 5 or clt.Status = 6) and
(clt.ReassignedTo = :operId or (clt.ReassignedTo is null and clt.DispatchedTo =operId))
and clt.ReadyDate >= :fdate and clt.ReadyDate <= :tdate
order by clt.AccountInfo.Oid]]
/query
执行查询时会出现问题,因为ClientFile包含以下属性:
<property name="PdfContent" column="RESULT_PDF" type="BinaryBlob" />
我很确定这个属性是从DB加载的(目前我不需要它)并且需要大量的内存。
当ClientFile
对象被NHibernate
加载(而不是通过NamedQuery
)时,属性未被加载,因为被视为懒惰...
答案 0 :(得分:0)
如果您不需要我建议的文件:
您还可以使用AliasToBean ResultTransformer,它会自动将查询返回的值映射到给定类型的属性。此方法要求查询中使用的别名直接映射到给定类型的属性。例如:
IList<Foo> foos = session.CreateQuery(
"select f.Name as Name, f.Value as Value from Foo f")
.SetResultTransformer(Transformers.AliasToBean<Foo>())
.List<Foo>();
编辑您的命名查询,投射所需内容并调用:
cltFiles = _dbSess.GetNamedQuery("GetReadyClientFilesForOper")
.SetString("operId", UserId)
.SetDateTime("fdate", from)
.SetDateTime("tdate", to)
.SetResultTransformer(Transformers.AliasToBean<ClientFile>())
.List<ClientFile>()
参考here
然后你可以加载二进制数据。
或阅读this,使用LazyLoad属性加载所有实体。
答案 1 :(得分:0)
我通过将BinayBlob设置为lazy = true(refenrece中的文章)尝试了approch。当我调用forllowing代码(我的命名查询转换为Criteria)时
_dbSess.CreateCriteria<ClientFile>()
.Add(Restrictions.Or(Restrictions.Eq("Status", 5), Restrictions.Eq("Status", 6)))
.Add(Restrictions.Or(Restrictions.Eq("ReassignedTo", UserId), Restrictions.And(Restrictions.IsNull("ReassignedTo"), Restrictions.Eq("DispatchedTo", UserId))))
.Add(Restrictions.And(Restrictions.Ge("ReadyDate", from), Restrictions.Le("ReadyDate", to)))
.List<ClientFile>();
Blob没有加载(Youpi!),但其他ClientFile列表和集合,也标记为懒惰,未加载。现在的问题是当我尝试访问其中一个IList或ICollections时,它们不会被NHibernate自动加载!