NHibernate 3 + NamedQuery + BinaryBlob属性?

时间:2013-12-31 18:28:23

标签: c# nhibernate

我必须使用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)时,属性未被加载,因为被视为懒惰...

2 个答案:

答案 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自动加载!