我在投影中检索字符串集合时遇到了一些问题: 说我有以下课程
public class WorkSet {
public Guid Id { get; set; }
public string Title { get; set; }
public ISet<string> PartTitles { get; protected set; }
}
public class Work {
public Guid Id { get; set; }
public WorkSet WorkSet { get; set; }
//a bunch of other properties
}
然后我有一个工作ID列表,我想检索WorkSet.Title,WorkSet.PartTitles和Id for。
我的想法是做这样的事情:
var works = Session.CreateCriteria<Work>()
.Add(Restrictions.In("Id", hitIds))
.CreateAlias("WorkSet", "WorkSet")
.SetProjection(
Projections.ProjectionList()
.Add(Projections.Id())
.Add(Projections.Property("WorkSet.Title"))
.Add(Projections.Property("WorkSet.PartTitles")))
.List();
Id和Title加载得很好,但PartTitles返回null。 建议请!
答案 0 :(得分:1)
使用条件可能无效。最有可能的原因是,这个集合无法通过标准生成的相同sql查询来检索。
我真的会考虑检索整个对象。它更容易,如果它不是一个非常特殊的情况,它是不值得的麻烦。 (顺便说一下,检索整个对象可能会更快,可能已经在缓存中。)通常重要的是查询的数量(当然是它的复杂性),而不是检索的列数。
它可能适用于HQL,那里有一个elements
函数。考虑使用HQL进行静态查询,它更强大。
select
ws.Title,
elements(ws.PartTitles),
w.id
from
Work w
inner join w.WorkSet ws
where w.id in (:ids)
select子句中允许 elements
,但我不知道你会得到什么。您最有可能获得与结果中有PartTitles一样多的记录,因为只构建了一个SQL语句。