随笔-21  评论-29  文章-0  trackbacks-0
以上实例有一个限制,即查询对象只能根据id值来查询。
我们可以通过完善HibernateUtil来实现更多更能。
package cn.itcast.hibernate;

import java.io.Serializable;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public final class HibernateUtil {
    
private static SessionFactory sessionFactory ;
    
private HibernateUtil(){}
    
    
static{
     Configuration cfg 
= new Configuration() ;
        cfg.configure();
        sessionFactory 
= cfg.buildSessionFactory();
     }


    
public static SessionFactory getSessionFactory() {
        
return sessionFactory;
    }

    
    
public static Session getSession(){
        
return sessionFactory.openSession();
    }

    
    
public static void add(Object entity){
        Session s 
= null ;
        Transaction tx 
= null ;
        
try{
            s 
= HibernateUtil.getSession();
            tx 
= s.beginTransaction();
            s.save(entity);        
            tx.commit();
        }
finally {
            
if(s !=null)
                s.close();
                  }

    }

    
    
public static void update(Object entity){
        Session s 
= null ;
        Transaction tx 
= null ;
        
try{
            s 
= HibernateUtil.getSession();
            tx 
= s.beginTransaction();
            s.update(entity);        
            tx.commit();
        }
finally {
            
if(s !=null)
                s.close();
                  }

    }

    
    
public static void delete(Object entity){
        Session s 
= null ;
        Transaction tx 
= null ;
        
try{
            s 
= HibernateUtil.getSession();
            tx 
= s.beginTransaction();
            s.delete(entity);        
            tx.commit();
        }
finally {
            
if(s !=null)
                s.close();
                  }

    }

    
    
public static Object get(Class clazz,Serializable id){
        Session s 
= null ;
        
try{
            s 
= HibernateUtil.getSession();
            Object obj 
= s.get(clazz, id);
            
return obj ;
        }
finally {
            
if(s !=null)
                s.close();
                  }

    }

}
以上代码就能实现常用的增、删、改以及根据id查询的功能了!

HQL(Hibernate Query Language)
面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分大小写);HQL中查的是对象而不是表,并且支持多态;
HQL主要通过Query接口来操作,Query的创建方式:
   Query q  =  session.createQuery(hql);
       from Person
       from  User  user  where  user.name =: name 
       from  User  user  where  user.name =: name and user.birthday<:birthday

Criteria
    Criteria是一种比HQL更面向对象的查询方式。Criteria的创建方式:
      Criteria  crit = session.createCriteria(DomainClass.class);
      简单属性条件如: criteria.add(Restrictions.eq(propertyName,value));
                                        criteria.add(Restrictions.eqProperty(propertyName,otherPropertyName));

实例操作
  新建一QueryTest类
package cn.itcast.hibernate;

import java.util.Date;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import cn.itcast.hibernate.domain.User;

public class QueryTest {

    
public static void main(String[] args) {
        User user 
= new User();
        user.setBirthday(
new Date());
        user.setName(
"name");
        HibernateUtil.add(user);    
        query(user.getName());
    }

    
    
static void query(String name){
        Session s 
= null ;
        
try{
            s 
= HibernateUtil.getSession();
            String hql 
= "from User as user where user.name=?";//from Object
            Query query = s.createQuery(hql);
            query.setString(
0, name);
            List
<User> list = query.list();//list作用类似于executeQuery
            
//User u = (User)query.uniqueResult(); //当查询结构唯一的时候可以使用
            
//System.out.print(u);
            for(User user : list){
                System.out.println(user.getName());
            }

        }
finally {
            
if(s !=null)
                s.close();
                  }

    }

}

观察输出结果


Oracle中 实体类或属性名与数据库关键字冲突问题
以上是User.hbm.xml原来的代码
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mapping package="cn.itcast.hibernate.domain">
    
<class name="User" table="user">
        
<id name="id">
            
<generator class="native" />
        
</id>        
        
<property name="name" column="name"/>
        
<property name="birthday"/>        
    
</class>
</hibernate-mapping>
User类默认关联的表名为user,但是user在oracle中是关键字
我们可以设置表名为tuser。
如果tuser已经存在,给表明加一对反引号,`user` 即可。不过最好还是只改表明。

如果是字段名(属性名)和关键字相冲突,其处理方法也是一样的!

HQL的命名参数
String hql = "from User as user where user.name=?";//from Object
            Query query = s.createQuery(hql);
            query.setString(
0, name);
以上语句中,如果where后面的属性有多个,就需要多个问号,而且在set方法里面容易犯错,比如记错顺序等。不利于维护。
为解决这个问题,我们可以使用HQL的命名参数来解决,代码如下:
String hql = "from User as user where user.name=:name";//from Object
            Query query = s.createQuery(hql);
            query.setString(
"name", name);

Query接口的两个方法实现分页查询
            query.setFirstResult(200); //从第200条记录开始
            query.setMaxResults(10);   //共set 10条记录
利用方言可以实现各个数据库的分页查询。
posted on 2009-05-04 15:11 特立独行 阅读(297) 评论(0)  编辑  收藏 所属分类: Hibernate框架

只有注册用户登录后才能发表评论。


网站导航: