对于Hibernate的查询,会用到的有六种方式:HQL查询,SQL查询,QBC(对象化查询Criteria方法)查询,QBE(Query By Example 例子查询)查询,离线查询(使用DetachedCriteria)和命名查询
【1】HQL查询:
HQL语句是Hibernate自己的一套查询语言,与sql语句不同,具有跨数据的有点
static void query(String name){
Session session = null ;
try{
session = HibernateUrl.getSession();
String hql = " from User as user where user.name=:name order by user.name asc";
Query query = sesion.createQuery(hql);
query.setString("name",name);
query.setFirstResult(0);
query.setMaxResults(10);
List<User> list = query.list();
for(User user:list){
System.out.println(user.getName());
{
}finally{
if(session!=null){
session.close();
}
}
}
注:from后面的是实体类的类名而不是表名
【2】SQL查询
Hibernate也可以执行sql语句,但是使用sql语句不面向对象,不方便维护
static void query(){
Session session = null ;
try{
session = HibernateUrl.getSession();
String sql = "select * from user";
Query query = s.createSQLQuery(sql).addEntity(User.class);
List<User> list = query.list();
for(User user:list){
System.out.println(user.getName());
}
session.commit();
}finally{
if(session!=null){
session.close();
}
}
}
【3】QBC查询:
QBC(Query By Criteria),这种方式比较面向对象,有三个描述对象的对象:Restrictions、Order、Projections。使用QBC有三个步骤:
1、使用session的实例的createCriteria()方法创建Criteria对象;
2、使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类设置排序方式,Projections类提供聚合方法;
3、使用Criteria对象的list()方法进行查询并返回结果。
Restrictions类:
方法名称 | 描述 |
Order.asc | 升序 |
Order.desc | 降序 |
static void query(String name,int age){
Session session = null ;
try{
session = HibernateUrl.getSession();
Criteria c = session.createCriteria(User.class);
c.add(Restrictions.eq("name",name));
c.add(Restrictions.lt("age",age));
c.addOrder(Order.asc("name"));
c.setProjection(Projections.avg("age"));
c.setFirstResult(0);
c.setMaxResults(10);
List<User> list = c.list();
for(User user:list){
System.out.println(user.getName);
}
}finally{
if(sessionion!=null){
session.close();
}
}
}
【4】QBE(Query By Example)
QBE:将一个对象的非空属性当做查询条件进行查询
static void query(){
Session session = null ;
try{
session = HibernateUrl.getSession();
User user = new User();
user.setName("tom");
user.setAge(24);
Example example = Example.create(user);
//example.enableLike(MatchMode.ANYWHERE);-->匹配模式,使用模糊查询必填
//example.excludeNone();-->空的不做查询条件
//example.excludeZeroes();-->0不要做查询
//example.ignoreCase();
//example.excludeProperty("age");-->忽略age字段
List<User> list = session.createCriteria(User.class).add(example).list();
session.commit();
}finally{
if(session!=null){
session.close();
}
}
}
【5】使用动态分离查询即离线查询(DetachedCriteria)
离线查询是建立一个DetachedCriteria对象,将查询的条件指定好,然后在session.beginTransaction()后将这个对象传入。通常这个对象可以在表示层建立,然后传入业务层进行查询。
//创建DetachedCriteria对象
staric void query(int id,String name){
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
int id = id;
String name = name ;
if(id!= 0){
dc.add(Restrictions.eq("id",id));
}
if(name!= null){
dc.add(Restrictions.le("name",name));
}
list<User> list = dc(dc);
for(User user:list){
System.out.println(user.getId()+":"+user.getName());
}
}
//执行方法
static void dc(DetachedCriteria dc){
Session s = null ;
try{
session = HibernateUrl.getSession();
Criteria c = dc.getExecutableCriteria(s);
List<User> list = c.list();
return list ;
}finally{
if(session!=null){
session.close();
}
}
}
【6】命名查询
命名查询分为两步:
1、配置Hibernate映射文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.sy.vo.User" table="user" catalog="news" </class>
<!-- 命名查询:定义hql -->
<query name="getUserById">
<![CDATA[from User where id=:id]]>
</query>
<!-- 命名查询中使用sql -->
<sql-query name="getUserById2">
<![CDATA[select * from User where ]]>
</sql-query>
</hibernate-mapping>
2、编写执行代码
static void query(int id){
Session session = null ;
try{
session = HibernateUrl.getSession();
Query query = session.getNamedQuery("getUserById");
query.setInteger("id",id);
List<User> list = query.list();
for(User user:list){
System.out.println(user.getName());
}
}finally{
if(session!= null){
session.close();
}
}
}