给定模型活动,其中包含一个包,其中包含类型为Report (一对多)的模型。我想获得所有活动的列表,其中包含每个活动的报告数量。这两个查询不会带来任何好处,计数器总是1(这是错误的):
select act, (select count(r) from act.Reports r) from Activity act或者:
select act, count( elements(act.Reports) ) from Activity act group by act.ActivityId, act.Title有没有可能用HQL编写适当的查询来解决这个简单的任务?
谢谢你给任何小费!sl3dg3
编辑:遵循映射。活动:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class
name="Core.Models.Config.Activity, Core"
table="Activity"
>
<!-- primary key -->
<id name="ActivityId" type="Int32" unsaved-value="0" access="property">
<column name="ActivityId" not-null="true"/>
<generator class="identity" />
</id>
<!-- Properties -->
<many-to-one name="Title" fetch="join" cascade="all"/>
<!-- One-To-Many Reports -->
<bag name="Reports" inverse="true" fetch="join">
<key column="ReportId" />
<one-to-many class="Core.Models.Report"/>
</bag>
</class>
</hibernate-mapping>映射报告:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class
name="Core.Models.Report, Core"
table="Report"
>
<!-- primary key -->
<id name="ReportId" type="Int32" unsaved-value="0" access="property">
<column name="ReportId" not-null="true"/>
<generator class="identity" />
</id>
<!-- Properties (shortened - there are more many-to-one and one bag -->
<property name="Created" />
<many-to-one name="Activity" column="ActivityId" />
</class>
课堂练习:
public class Activity
{
public Activity()
{
Title = new Translation();
}
public virtual int ActivityId { get; set; }
public virtual Translation Title { get; set; }
public virtual IList<Report> Reports { get; set; }
}课堂报告:
public class Report
{
/// <summary>
/// HNIBERNATE ONLY
/// </summary>
public Report()
{ }
/// <summary>
/// Init Report
/// </summary>
public Report(User author)
{
// ... Shortened
Activity = new Activity();
}
public virtual Activity Activity { get; set; }
}发布于 2011-03-22 22:26:21
您的第一个HQL查询具有错误的语法。试着这样做:
select act, (select count(*) from act.Reports) from Activity act您的第二个HQL查询无法工作,因为您将需要GROUP BY子句中的所有列。试着这样做:
select act.ActivityId, act.Title, count( elements(act.Reports) )
from Activity act
group by act.ActivityId, act.Title编辑:
啊,我想这可能是bug:
<bag name="Reports" inverse="true" fetch="join">
<key column="ActivityId" /> <-- instead of ReportId
<one-to-many class="Core.Models.Report"/>
</bag>发布于 2011-03-23 17:04:20
您希望在SQL中实现的内容如下所示:
select
act.*,
(select count(*) from Reports rep where rep.id = act.reportId)
from Activity act使用size()是最简单的,但不幸的是这是不能工作的
select act, size(act.Reports)
from Activity act根据文档,size在select子句中不可用。有趣的是,it实际上可以在中使用.size,但不能在size()中使用,这实际上应该是等效的:
select act, act.Reports.size
from Activity act让函数语法(size())正常工作可能是一个值得的特性请求。
官方工作的group by语法很麻烦,因为您需要按所有映射的活动属性进行分组:
select act, count(*)
from Activity act left join act.Reports rep
group by act.id, act.Name, act.Whatever所以我最终尝试了这个变体,它看起来就是你需要的
select act, (select count(*) from act.Reports)
from Activity acthttps://stackoverflow.com/questions/5390906
复制相似问题