翻开之前的博客,距离最开始写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对象