Oracle 我可以将内联视图与criteria API一起使用吗?
NHibernate是否支持使用标准的内联视图?谷歌似乎没有返回任何相关结果。下面是我需要转换的查询,最好使用criteriaOracle 我可以将内联视图与criteria API一起使用吗?,oracle,nhibernate,criteria,inline-view,Oracle,Nhibernate,Criteria,Inline View,NHibernate是否支持使用标准的内联视图?谷歌似乎没有返回任何相关结果。下面是我需要转换的查询,最好使用criteria SELECT COUNT (incident_count) AS incident_count, SUM (total_customers) AS total_customers, MAX (longest_etr) AS longest_etr, COUNT (DISTINCT crew_count) AS crew_coun
SELECT COUNT (incident_count) AS incident_count,
SUM (total_customers) AS total_customers,
MAX (longest_etr) AS longest_etr,
COUNT (DISTINCT crew_count) AS crew_count
FROM (SELECT l.incident_id AS incident_count,
i.downstream_cust_qty_total AS total_customers,
TO_CHAR (MAX (l.etr_datetime),
'MM/DD/YYYY HH24:mi:ss'
) AS longest_etr,
ca.crew_no AS crew_count
FROM district d,
LOCATION l,
ZONE z,
incident_device ID,
incident i,
crew_action ca
WHERE l.dist_no = d.dist_no
AND d.zone_id NOT IN (1008, 1010)
AND ID.location_id = l.location_id
AND ID.incident_id = i.incident_id
AND l.location_id = i.location_id
AND ca.incident_id = i.incident_id
AND ca.location_id = l.location_id
AND ID.call_type_cd IN ('ELEC', 'PLAN')
AND ID.clue_cd NOT IN (248, 258, 975)
AND l.fac_job_status_cd IN ('A', 'D', 'F', 'G', 'P', 'U', 'W')
AND z.zone_id = d.zone_id
AND ca.crew_action_id = l.crew_action_id
AND l.dist_no = 24
AND l.primary_loc_flg = 'T'
GROUP BY l.incident_id, i.downstream_cust_qty_total, ca.crew_no)
我已经在where子句中转换了所有内容。那部分没问题。也就是说
GetSession().CreateCriteria(typeof (Incident), () => incidentAlias)
// Projection
.SetProjection(
Projections.ProjectionList()
.Add(LambdaProjection.Count<Incident>(i => incidentAlias.IncidentId).As(() => IncidentCount))
.Add(LambdaProjection.Sum<Incident>(i => incidentAlias.DownstreamCustQtyTotal).As(() => TotalCustomers))
.Add(LambdaProjection.Max<Location>(l => locationAlias.EtrDatetime).As(() => LongestEtr))
.Add(LambdaProjection.CountDistinct<CrewAction>(ca => crewActionAlias.CrewNo).As(() => CrewCount))
.Add(LambdaProjection.GroupProperty(() => incidentAlias.IncidentId))
.Add(LambdaProjection.GroupProperty(() => incidentAlias.DownstreamCustQtyTotal))
.Add(LambdaProjection.GroupProperty(() => crewActionAlias.CrewNo))
)
// Aliases
.CreateAlias(() => incidentAlias.Locations, () => locationAlias)
.CreateAlias(() => incidentAlias.IncidentDevices, () => incidentDeviceAlias)
.CreateAlias(() => incidentAlias.District, () => districtAlias)
.CreateAlias(() => districtAlias.Zone, () => zoneAlias)
.CreateAlias(() => locationAlias.CrewAction, () => crewActionAlias)
// Criterias
.Add(() => locationAlias.PrimaryLocFlg == "T")
.Add(() => locationAlias.DistNo == districtNumber)
.Add(() => zoneAlias.ZoneId != 1008)
.Add(() => zoneAlias.ZoneId != 1010)
.Add(SqlExpression.In(() => locationAlias.FacJobStatusCd, new[] { "A", "D", "F", "G", "P", "U", "W" }))
.Add(SqlExpression.In(() => incidentDeviceAlias.CallTypeCd, new [] { "ELEC", "PLAN" }))
.Add(() => incidentDeviceAlias.ClueCd != "248")
.Add(() => incidentDeviceAlias.ClueCd != "258")
.Add(() => incidentDeviceAlias.ClueCd != "975")
.SetResultTransformer(Transformers.AliasToBean<Dto>())
.List<Dto>();
注意,我使用的是Lambda标准扩展。或者,我想我可以创建一个额外的Dto来选择没有聚合函数的所有列,然后使用Linq来执行count/sum/max/count distinct。我刚刚用HQL尝试了它,但它与Criteria API不起作用。但是,有效的方法如下:
select
(select count(*) from Table1 t1),
(select sum(*) from Table2 t2)
from DummyTable dt
where rownum <= 1
DummyTable除了在那里没有做任何事情,所以NHibernate不会为此哭泣,而rownum我只是用HQL尝试了一下,但它不起作用,这与Criteria API是一样的。但是,有效的方法如下:
select
(select count(*) from Table1 t1),
(select sum(*) from Table2 t2)
from DummyTable dt
where rownum <= 1
DummyTable除了在那里之外什么都没做,所以NHibernate不会为此哭泣,而rownum这个查询没有什么意义。它相当于内部查询。你到底想运行什么查询?@Diego这是Oracle上非常流行的方法->@Rafael,在示例中还有其他过滤器。在这些情况下,这是有道理的。在任何情况下,内联视图都是一个Oracle术语,而不是NH术语,现在几乎每个人都称之为子查询。。哈哈,我道歉。我想我可以用一个非常基本的例子,但结果不是很好p这个查询没有什么意义。它相当于内部查询。你到底想运行什么查询?@Diego这是Oracle上非常流行的方法->@Rafael,在示例中还有其他过滤器。在这些情况下,这是有道理的。在任何情况下,内联视图都是一个Oracle术语,而不是NH术语,现在几乎每个人都称之为子查询。。哈哈,我道歉。我想我可以用一个非常基本的例子,但结果不是很好P