Fb HQL实用技术
实体查询
简单例子:
String hql = "from User";
Query query = session.createQuery(hpl);
List userList = query.list();
上面的hql:"from User",将取出User的所有对应记录,对应的SQL为"select ..from User".
我们也可以在HQL中采用全路径名,特别是在应用中存在同名类(包名不同)的情况下使用,
如:
"from com.hpjianhua.hibernate.entity.User"
注意:HQL子句本身大小写无关,但是其中出现的类名与属性名必须注意是大小写区分的,
Hibernate中,查询的目标实体存在着继承关系的判定,如:"from User"将返回所有User以及
基子类的记录.
查询时的限定:
String hql = "from User as user where user.name='Hpjianhua'";
Query query = session.createQuery(hql);
List userList = query.list();
这里我们新引入了两个子句"as" 与"where",as 子句为类名创建了一个别名,而where子句指定了限定条件.其中as子句可忽略.如:
"from User user where user.name='hpjianhua'";
属性查询:
查询非完整实体对象(查询单个属性):
List list = session.createQuery("select user.name from User user").list();
查询多个属性:
List list = session.createQuery("select user.name,user.age from User user").list();
返回的是一个Object数组对象.
则:
Iterator it = list.iterator();
while(it.hasNext()){
Object[] results = (Object[])it.next();
System.out.println(results[0]);
System.out.println(results[1]);
}
如果觉得返回数组的方式不够面向对象的风格,我们也可以通过在HQL中动态构造对象实例的方法对这些平面化的数据进行封装.如:
List list = this.session.createQuery("select new User(user.nage,user.age) from User as user").list();
我们也可以在HQL的Select子句中使用统计函数:
List list = session.createQuery("select count(*),min(user.age) from User as user").list();
甚至原生SQL函数,如:
select upper(user.name) from User as user;
或者利用distinct 关键字,去掉返回集中的重复记录.
select distinct user.name from User as user;
实体的更新与删除
更新实例:
Transaction tx = session.beginTransaction();
String hql = "update User set age =19 where id=1";
Query query = session.createQuery(hql);
query.executeUpdate();
tx.commit():
删除实例:
Transaction tx = session.beginTransaction();
String hql = "delete User where age =19";
Query query = session.createquery(hql);
int ret =query.executeUpdate();
System.out.println("Delete records =>"+ret);
tx.commit();
分组与排序
Order by 子句
与SQL类似,HQL通过order by 子句实现 对查询的结果排序,如:
from User user order by user.name
Order by 子句是可以指定多个排序条件的:
from User user order by user.name ,user.age desc;
Group by 子句:
String hql="select count(user),user.age from User user group by user.age";
参数绑定
String hql="from User where name=:name and age=:age";
Query query = session.createQuery(hql);
引用查询
Hibernate 提供了可配置化的内置支持
我们可以在映射文件中,通过query节点定义查询语句(与class节点同级):
<hibernate-mapping package="com.hpjianhua.web">
<class name="Item" table="t_items">
<id name="itemNo">
<generator class="assigned"/>
</id>
<property name="itename="queryByName">
<![CDATA[
from User user where user.name=:name
]]>
</query>
</hibernate-mapping>
然后,我们通过Session.getNamedQuery方法从配置文件中调用对应的HQL,如:
Query query = session.getNamedQuery("queryByName");
联合查询
1.inner join
2.left outer join
3.right outer join
4.full join(not usually useful)
数据加载方式
Hibernate支持以下几种数据加载方式:
即时加载(Immediate Loading)
当实体加载完成后,立即加载其关联数据
延迟加载(Lazy Loading)
实体加载时,其关联数据并非马上获取,而是当关联数据第一次被访问时再进行读取.
预先加载(Eager Loading)
预先加载时,实体及其关联对象同时读取,这与即时加载类似,不过实体及其关联数据是通过一条SQL语句(基于外连接[outer join])同时读取.
批量加载(Batch Loading)
对于即时加载与延迟加载,可以采用批量加载方式进行性能上的优化
实体查询
简单例子:
String hql = "from User";
Query query = session.createQuery(hpl);
List userList = query.list();
上面的hql:"from User",将取出User的所有对应记录,对应的SQL为"select ..from User".
我们也可以在HQL中采用全路径名,特别是在应用中存在同名类(包名不同)的情况下使用,
如:
"from com.hpjianhua.hibernate.entity.User"
注意:HQL子句本身大小写无关,但是其中出现的类名与属性名必须注意是大小写区分的,
Hibernate中,查询的目标实体存在着继承关系的判定,如:"from User"将返回所有User以及
基子类的记录.
查询时的限定:
String hql = "from User as user where user.name='Hpjianhua'";
Query query = session.createQuery(hql);
List userList = query.list();
这里我们新引入了两个子句"as" 与"where",as 子句为类名创建了一个别名,而where子句指定了限定条件.其中as子句可忽略.如:
"from User user where user.name='hpjianhua'";
属性查询:
查询非完整实体对象(查询单个属性):
List list = session.createQuery("select user.name from User user").list();
查询多个属性:
List list = session.createQuery("select user.name,user.age from User user").list();
返回的是一个Object数组对象.
则:
Iterator it = list.iterator();
while(it.hasNext()){
Object[] results = (Object[])it.next();
System.out.println(results[0]);
System.out.println(results[1]);
}
如果觉得返回数组的方式不够面向对象的风格,我们也可以通过在HQL中动态构造对象实例的方法对这些平面化的数据进行封装.如:
List list = this.session.createQuery("select new User(user.nage,user.age) from User as user").list();
我们也可以在HQL的Select子句中使用统计函数:
List list = session.createQuery("select count(*),min(user.age) from User as user").list();
甚至原生SQL函数,如:
select upper(user.name) from User as user;
或者利用distinct 关键字,去掉返回集中的重复记录.
select distinct user.name from User as user;
实体的更新与删除
更新实例:
Transaction tx = session.beginTransaction();
String hql = "update User set age =19 where id=1";
Query query = session.createQuery(hql);
query.executeUpdate();
tx.commit():
删除实例:
Transaction tx = session.beginTransaction();
String hql = "delete User where age =19";
Query query = session.createquery(hql);
int ret =query.executeUpdate();
System.out.println("Delete records =>"+ret);
tx.commit();
分组与排序
Order by 子句
与SQL类似,HQL通过order by 子句实现 对查询的结果排序,如:
from User user order by user.name
Order by 子句是可以指定多个排序条件的:
from User user order by user.name ,user.age desc;
Group by 子句:
String hql="select count(user),user.age from User user group by user.age";
参数绑定
String hql="from User where name=:name and age=:age";
Query query = session.createQuery(hql);
引用查询
Hibernate 提供了可配置化的内置支持
我们可以在映射文件中,通过query节点定义查询语句(与class节点同级):
<hibernate-mapping package="com.hpjianhua.web">
<class name="Item" table="t_items">
<id name="itemNo">
<generator class="assigned"/>
</id>
<property name="itename="queryByName">
<![CDATA[
from User user where user.name=:name
]]>
</query>
</hibernate-mapping>
然后,我们通过Session.getNamedQuery方法从配置文件中调用对应的HQL,如:
Query query = session.getNamedQuery("queryByName");
联合查询
1.inner join
2.left outer join
3.right outer join
4.full join(not usually useful)
数据加载方式
Hibernate支持以下几种数据加载方式:
即时加载(Immediate Loading)
当实体加载完成后,立即加载其关联数据
延迟加载(Lazy Loading)
实体加载时,其关联数据并非马上获取,而是当关联数据第一次被访问时再进行读取.
预先加载(Eager Loading)
预先加载时,实体及其关联对象同时读取,这与即时加载类似,不过实体及其关联数据是通过一条SQL语句(基于外连接[outer join])同时读取.
批量加载(Batch Loading)
对于即时加载与延迟加载,可以采用批量加载方式进行性能上的优化