现在的位置: 首页 > 综合 > 正文

Hibernate的六种查询方式

2014年09月05日 ⁄ 综合 ⁄ 共 5541字 ⁄ 字号 评论关闭
package com.test.cn.test;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Restrictions;

import com.test.cn.entity.User;
import com.test.cn.HibernateSessionFactory;

public class TestUser {

	public static void main(String[] args) {
//		test1();
		test7();
	}

	private static void test1() {
		Configuration config=new Configuration().configure();  
		SessionFactory sessionFactory=config.buildSessionFactory();  
		 
		User user=new User();  
		user.setName("admin");  
		user.setPassword("admin");
		user.setEmail("admin@126.com");
		
		Session session=sessionFactory.openSession();  
		Transaction tx=session.beginTransaction();  
		session.save(user);  
		tx.commit();  
		
		session.close();  
		sessionFactory.close(); 
		
		System.out.println("OK!");
	}
	
	/**
	 * HQL查询
	 * 适用情况:常用方法,比较传统,类似jdbc。缺点:新的查询语言,适用面有限,仅适用于Hibernate框架。
	 */
	@SuppressWarnings("unchecked")
	private static void test2() {
		Configuration config = HibernateSessionFactory.getConfiguration().configure();
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session=sessionFactory.openSession();  
//		String hql = "from User u where u.name = :name";
//		Query query = session.createQuery(hql);
//		query.setString("name", "admin");
		String hql = "from User u where u.name = ?";
		Query query = session.createQuery(hql);
		query.setString(0, "admin");//注:此处从0开始
		List<User> list = query.list();
		
		for(User u : list){
			System.out.println(u.getId() + "|" + u.getName() + "|" + u.getPassword() + "|" + u.getEmail());
		}
		
		session.close();  
		sessionFactory.close(); 
		
		System.out.println("OK!");
	}
	
	/**
	 * sql查询
	 * 适用情况:不熟悉HQL的朋友,又不打算转数据库平台的朋友,万能方法   缺点:破坏跨平台,不易维护,不面向对象。
	 */
	@SuppressWarnings("unchecked")
	private static void test3(){
		Configuration configuration  = HibernateSessionFactory.getConfiguration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		
		Session session = sessionFactory.openSession();
//		SQLQuery q = session.createSQLQuery("select * from tb_user t where t.name = :name");
//		q.setString("name", "admin");
		SQLQuery q = session.createSQLQuery("select * from tb_user t where t.name = ?");
		q.setString(0, "admin");//注:此处从0开始
		q.addEntity(User.class);
		List<User> list = q.list();
		for(User u : list){
			System.out.println(u.getId() + "|" + u.getName() + "|" + u.getPassword() + "|" + u.getEmail());
		}
		
		session.close();  
		sessionFactory.close(); 
		
		System.out.println("OK!");
	}
	
	/**
	 * 对象化查询Criteria方法:
	 * 适用情况:面向对象操作,革新了以前的数据库操作方式,易读。缺点:适用面较HQL有限。
	 */
	private static void test4(){
		Configuration configuration  = HibernateSessionFactory.getConfiguration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		
		Session session = sessionFactory.openSession();
		Criteria criteria = session.createCriteria(User.class);
		criteria.add(Restrictions.eq("name", "admin"));//eq是等于,gt是大于,lt是小于,or是或
		criteria.add(Restrictions.eq("password", "admin"));
		
		List<User> list = criteria.list();
		for(User u : list){
			System.out.println(u.getId() + "|" + u.getName() + "|" + u.getPassword() + "|" + u.getEmail());
		}
		
		session.close();  
		sessionFactory.close(); 
		
		System.out.println("OK!");
	}
	
	/**
	 * 动态分离查询DetachedCriteria
	 * 适用情况:面向对象操作,分离业务与底层,不需要字段属性摄入到Dao实现层。  缺点:适用面较HQL有限。
	 */
	private static void test5(){
		Configuration configuration  = HibernateSessionFactory.getConfiguration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		
		Session session = sessionFactory.openSession();
		Criteria criteria = session.createCriteria(User.class);
		criteria.add(Restrictions.eq("name", "admin"));//eq是等于,gt是大于,lt是小于,or是或
		criteria.add(Restrictions.eq("password", "admin"));
		
		List<User> list = criteria.list();
		for(User u : list){
			System.out.println(u.getId() + "|" + u.getName() + "|" + u.getPassword() + "|" + u.getEmail());
		}
		
		session.close();  
		sessionFactory.close(); 
		
		System.out.println("OK!");
	}
	
	/**
	 * 例子查询
	 * 适用情况:面向对象操作。   缺点:适用面较HQL有限,不推荐。
	 */
	private static void test6(){
		Configuration configuration  = HibernateSessionFactory.getConfiguration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		
		Session session = sessionFactory.openSession();
		Criteria criteria = session.createCriteria(User.class);
		criteria.add(Example.create(new User()));
		
		List<User> list = criteria.list();
		for(User u : list){
			System.out.println(u.getId() + "|" + u.getName() + "|" + u.getPassword() + "|" + u.getEmail());
		}
		
		session.close();  
		sessionFactory.close(); 
		
		System.out.println("OK!");
	}
	
	/**
	 * 命名查询
	 * 适用情况:万能方法,有点像ibatis轻量级框架的操作,方便维护。  缺点:不面向对象。基于hql和sql,有一定缺陷。
	 */
	private static void test7(){
		Configuration configuration  = HibernateSessionFactory.getConfiguration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		
		Session session = sessionFactory.openSession();
		Query query = session.getNamedQuery("getUserById");
		query.setLong("id", 2l);
		List<User> list = query.list();
		
		for(User u : list){
			System.out.println(u.getId() + "|" + u.getName() + "|" + u.getPassword() + "|" + u.getEmail());
		}
		
		session.close();  
		sessionFactory.close(); 
		
		System.out.println("OK!");
	}
	
}

配置文件及实体类:

<?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.test.cn.entity.User" table="tb_user">     
    <id name="id" column="id" type="java.lang.Integer">     
     <generator class="native"/>     
     </id>
        <property name="name" column="name" type="java.lang.String"/>     
        <property name="password" column="password" type="java.lang.String"/>     
        <property name="email" column="email" type="java.lang.String"/>     
        
    </class>     
        <!-- 命名查询:定义查询条件 -->
    <query name="getUserById">
     <![CDATA[from User where id=:id]]>
    </query>
    
</hibernate-mapping>
package com.test.cn.entity;
public class User {
	private Integer id;  
	private String name;  
	private String password;  
	private String email;
	private Integer organId;
	
	...get/setMethod();
}

抱歉!评论已关闭.