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对象


  • 相关阅读:
    Spring boot unable to determine jdbc url from datasouce
    Unable to create initial connections of pool. spring boot mysql
    spring boot MySQL Public Key Retrieval is not allowed
    spring boot no identifier specified for entity
    Establishing SSL connection without server's identity verification is not recommended
    eclipse unable to start within 45 seconds
    Oracle 数据库,远程访问 ora-12541:TNS:无监听程序
    macOS 下安装tomcat
    在macOS 上添加 JAVA_HOME 环境变量
    Maven2: Missing artifact but jars are in place
  • 原文地址:https://www.cnblogs.com/chenxiaochan/p/7237547.html
Copyright © 2011-2022 走看看