zoukankan      html  css  js  c++  java
  • 【hibernate进阶】hql简单属性查询

            翻开之前的博客,距离最开始写hibernate进阶专栏的第一篇博客开始,已经有八个多月了,因为最近做的项目在用hql,所以继续完善这个专栏.在今天主要分享hql的简单属性查询,通过查询单个属性和通过五种不同的查询方式来讲解.


    1.hql单个属性查询

    首先新建一个Student的JavaBean.
    package com.hqlquery.hibernate;
    
    import java.util.Date;
    
    public class Student {
    
    	private int id;
    	
    	private String name;
    
    	private Date createTime;
    		
    	public int getId() {
    		return id;
    	}
    
    	public void setId(int id) {
    		this.id = id;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public Date getCreateTime() {
    		return createTime;
    	}
    
    	public void setCreateTime(Date createTime) {
    		this.createTime = createTime;
    	}
    }
    

            hql的单个属性查询的hql语句和sql语句查询单个属性类似,hql语句查询时使用的单个属性与JavaBean中的字段一致,sql语句查询时使用的单个属性与数据库表字段一致.语句都是select 字段名 from 表名
    package com.hibernate.hibernate;
    
    import java.util.Iterator;
    import java.util.List;
    
    import org.hibernate.Session;
    
    import junit.framework.TestCase;
    
    
    public class SimplePropertyQueryTest extends TestCase {
    //hql单个属性查询
    public void testQuery(){
    	Session session=null;
    	try{
    		session=HibernateUtils.getSession();
    		session.beginTransaction();
    		List students=session.createQuery("select name from Student").list;
    		for(Iterator iter=student.iterator();iter.hasNext();){
    			String name=(String)iter.next();
    			System.out.println(name);
    		}
    		session.getTransaction().commit();
    	}catch(Exception e){
    		e.printStackTrace();
    		session.getTransaction().commit();
    	}finally{
    		HibernateUtils.closeSession(session);
    	}
    }


    2.hql多个属性查询

    返回entity

    返回entity的时候,需要提供构造函数,例如查询时使用的属性是id和name,那么则需要提供相应的构造函数.
    public Student() {
    	}
    
    	public Student(int id, String name) {
    		this.id = id;
    		this.name = name;
    	}
    	
    在写测试类的时候,只需要将hql语句和返回的类型修改即可.

    //hql多个属性查询,返回student
    public void testQuery(){
    	Session session=null;
    	try{
    		session=HibernateUtils.getSession();
    		session.beginTransaction();
    		//可以使用hql返回student对象,需要提供构造函数
    		List students=session.createQuery("select new Student(id,name) from Student").list;
    		for(Iterator iter=student.iterator();iter.hasNext();){
    			Student student=(Student)iter.next();
    			System.out.println(student.getId()+","+student.getName());
    		}
    		session.getTransaction().commit();
    	}catch(Exception e){
    		e.printStackTrace();
    		session.getTransaction().commit();
    	}finally{
    		HibernateUtils.closeSession(session);
    	}
    }


    返回object

    //hql多个属性查询,返回对象数组
    public void testQuery(){
    	Session session=null;
    	try{
    		session=HibernateUtils.getSession();
    		session.beginTransaction();
    		//查询多个属性,返回对象数组集合
    		//数组元素的类型与查询的属性类型一致
    		//数组的长度与select中查询的属性个数一致
    
    		List students=session.createQuery("select id,name from Student").list;
    		for(Iterator iter=student.iterator();iter.hasNext();){
    			Object[] obj=(Object[])iter.next();
    			System.out.println(obj[0]+","+obj[1]);
    		}
    		session.getTransaction().commit();
    	}catch(Exception e){
    		e.printStackTrace();
    		session.getTransaction().commit();
    	}finally{
    		HibernateUtils.closeSession(session);
    	}
    }


    使用别名

    使用别名查询的时候有两种形式,使用as别名和不使用as别名.

    1.不使用as别名

    select s.id, s.name from Student s

    //hql多个属性查询,返回student
    public void testQuery(){
    	Session session=null;
    	try{
    		session=HibernateUtils.getSession();
    		session.beginTransaction();
    		//可以使用as别名
    		List students=session.createQuery("select s.id,s.name from Student s").list;
    		for(Iterator iter=student.iterator();iter.hasNext();){
    			Student student=(Student)iter.next();
    			System.out.println(student.getId()+","+student.getName());
    		}
    		session.getTransaction().commit();
    	}catch(Exception e){
    		e.printStackTrace();
    		session.getTransaction().commit();
    	}finally{
    		HibernateUtils.closeSession(session);
    	}
    }
    


    2.使用as别名

    select s.id, s.name from Student as s


    //hql多个属性查询,返回student
    public void testQuery(){
    	Session session=null;
    	try{
    		session=HibernateUtils.getSession();
    		session.beginTransaction();
    		//可以使用as别名
    		List students=session.createQuery("select s.id,s.name from Student as s").list;
    		for(Iterator iter=student.iterator();iter.hasNext();){
    			Student student=(Student)iter.next();
    			System.out.println(student.getId()+","+student.getName());
    		}
    		session.getTransaction().commit();
    	}catch(Exception e){
    		e.printStackTrace();
    		session.getTransaction().commit();
    	}finally{
    		HibernateUtils.closeSession(session);
    	}
    }
    


    总结:

    简单属性查询
    * 单一属性查询,返会属性结果集列表,元素类型和实体类中相应的类型一致
    * 多个属性查询,多个属性查询返会对象数组,对象数组的长度取决于属性的个数
     对象数组中元素的类型取决于属性在实体类中的类型
    * 如果认为返会数组不够对象化,可以使用hql动态实例化Student对象


  • 相关阅读:
    深入理解java虚拟机(7)---线程安全 & 锁优化
    深入理解java虚拟机(6)---内存模型与线程 & Volatile
    java注解框架
    敏捷软件开发---闲话敏捷
    深入理解java虚拟机(5)---字节码执行引擎
    龙应台写给儿子安德烈的信
    wojilu中的路由
    如何使用豆约翰博客备份专家批量下载新浪微博
    haha
    http://www.jsbreakouts.org/---各种html5框架实现打砖块游戏 breakout
  • 原文地址:https://www.cnblogs.com/chenxiaochan/p/7237547.html
Copyright © 2011-2022 走看看