这里以Northwind数据库为示例数据库
示例数据表:Products
现在只用产品表中部分字段。
持久类如下:
public class Products
{
public virtual int ProductID { get; set; }
public virtual string ProductName { get; set; }
public virtual int CategoryID { get; set; }
public virtual float Price { get; set; }
}
映射文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Entities">
<class name="Products" table="Products">
<id name="ProductID" column="ProductID">
<generator class="identity"></generator>
</id>
<property name="ProductName" column="ProductName" type="String"></property>
<property name="CategoryID" column="CategoryID" type="Int32"></property>
<property name="Price" column="UnitPrice" type="Single"></property>
</class>
</hibernate-mapping>
开始
(一)Avg(平均值)
IQuery q = _session.CreateQuery("select avg(Price) from Products where CategoryID=2");
return Convert.ToSingle(q.List()[0]);
查询类型为2的所有产品的平均售价
·对于平均值来说,结果是一个,但返回的还是一个集合。
(二)Max(最大的)
IQuery q = _session.CreateQuery("select max(Price) from Products");
return Convert.ToSingle(q.List()[0]);
查询最大的价格
(三)Min(最小的)
IQuery q = _session.CreateQuery("select min(Price) from Products");
return Convert.ToSingle(q.List()[0]);
查询最低的价格
(四)Count
IQuery q = _session.CreateQuery("select count(*) from Products");
return Convert.ToSingle(q.List()[0]);
查询总数
这里穿插一下distinct用法。
采上Employees表
查询城市数目:
IQuery q = _session.CreateQuery("select count(City) from Employees");
return Convert.ToSingle(q.List()[0]);
查询不重复的城市数目
IQuery q = _session.CreateQuery("select count(distinct City) from Employees");
(五)Sum(求和)
IQuery q = _session.CreateQuery("select sum(Price) from Products where CategoryID=2");
return Convert.ToSingle(q.List()[0]);
求和类别为2的产品的总价格
Order by
(六)Order by
(1) 单属性排序
IQuery q = _session.CreateQuery("select Price from Products p order by Price");
return q.List<float>();
(2) 多属性排序
IQuery q = _session.CreateQuery("select Price from Products p order by Price,ProductID desc");
return q.List<float>();
(七)Group by
(1)单属性分组
IQuery q = _session.CreateQuery("select CategoryID from Products group by CategoryID");
return q.List<int>();
以产品类别分组,这里要注意的是返回的类型。在上一篇中我说明了这里的理解方式。
(2)多属性分组及聚合
IQuery q = _session.CreateQuery("select CategoryID,count(*) from Products group by CategoryID");
return q.List<object[]>() as List<object[]>;
这里以产品类别分组,并取得每个类别的数目。这里得到的是一个多对象多属性集合。可以得到一个object数据组的泛型集合。对于这种类型的转化,在上一篇中已经说明。
(3)Having属性
IQuery q = _session.CreateQuery("select CategoryID,count(*) from Products group by CategoryID having count(*)>10");
return q.List<object[]>() as List<object[]>;
这里以产品类别分组,并取得每个类别的数目,且类别产品数目在10个以上的保留。
这是HQL查询,是支持having子句的。