在我的网站上,人们可以购买汽车零件。我想为客户创建一份报告,以了解他们每月在网站上花费的金额,并允许他们按日期过滤。如果我是用SQL编写的,我会写这个:
SELECT
v.id,
DATEPART(YEAR, o.order_date),
DATEPART(MONTH, o.order_date),
SUM(i.unit_price * i.quantity)
FROM vehicles v
join order_items i on v.id = i.truck_id
join orders o on o.order_id = i.order_id
WHERE v.customer_id = @CustomerId
AND o.order_date > @StartDate
AND o.order_date < @EndDate
GROUP BY DATEPART(YEAR, o.order_date), DATEPART(MONTH, o.order_date)
这个查询甚至可以作为NHibernate中的Criteria查询吗?
答案 0 :(得分:4)
是的,有办法:
CurrentSession.CreateCriteria(typeof(Object)).Add(Expression.Eq(Projections.SqlFunction("day", NHibernateUtil.DateTime, Projections.Property("DateTimeProperty")), pvDay))
其中“day”是您希望从日期获得的值(“DateTimeProperty”),而pvDay是您将其与之比较的日期。
答案 1 :(得分:3)
有些人认为Criteria API是HQL的现代替代品。这不可能是事实。 Criteria API旨在用于必须动态构建查询的场景。对于静态查询,为什么要惩罚自己?只需使用优秀的旧HQL API(可以参数化它),它确实支持分组以及您抛出的任何其他内容。