Hibernate的六种查询方式

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();
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值