您的位置:首页 > 其它

Hibernate学习文档_HQL

2011-08-20 16:49 337 查看
Entity与mapping文件

public class Student {

private int id;
private String name;
private Date createTime;
private Classes classes;

public Student() {
}

public Student(int id, String name) {
this.id = id;
this.name = name;
}
}

public class Classes {

private int id;
private String name;
private Set<Student> students;

public Classes(){

}
}


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.lohamce.hibernate.Student" table="t_student">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<property name="createTime" />
<many-to-one name="classes" column="classesid" />
<filter name="filter" condition="id < :myid" />
</class>

<query name="Student.searchStudents">
<![CDATA[
SELECT s FROM Student s where s.id<?
]]>
</query>

<filter-def name="filter">
<filter-param name="myid" type="integer" />
</filter-def>
</hibernate-mapping>


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.lohamce.hibernate">
<class name="Classes" table="t_classes">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<set name="students" inverse="true" cascade="all">
<key column="classesid" />
<one-to-many class="Student" />
</set>
</class>
</hibernate-mapping>


//初始化数据
@Test
public void initStudents(){
Session session = HibernateUtil.openSession();

try {
session.beginTransaction();

for(int i=0; i<10; i++){

Classes classes = new Classes();
classes.setName("班级"+i);
session.save(classes);

for(int j=0; j<10; j++){
Student student = new Student();
student.setName("班级"+i+"的学生"+j);
student.setCreateTime(randomDate("2008-01-01","2008-03-01"));

//在内存中建立由student指向classes的引用
student.setClasses(classes);
session.save(student);
}
}

for(int i=0; i<5; i++){
Classes classes = new Classes();
classes.setName("无学生班级"+i);
session.save(classes);
}

for(int i=0; i<10; i++){
Student student = new Student();
student.setName("无业游民"+i);
session.save(student);
}

session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally{
HibernateUtil.close(session);
}
}

/**
* 获取随机日期
* @param beginDate 起始日期,格式为:yyyy-MM-dd
* @param endDate 结束日期,格式为:yyyy-MM-dd
* @return
*/
private static Date randomDate(String beginDate,String endDate){
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date start = format.parse(beginDate);
Date end = format.parse(endDate);

if(start.getTime() >= end.getTime()){
return null;
}

long date = random(start.getTime(),end.getTime());

return new Date(date);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

private static long random(long begin,long end){
long rtn = begin + (long)(Math.random() * (end - begin));
if(rtn == begin || rtn == end){
return random(begin,end);
}
return rtn;
}


1.简单属性查询

@Test
public void testQuery1() {
Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();

//1.返回结果集属性列表,元素类型和实体类中相应的属性类型一致
List students = session.createQuery("select name from Student").list();
for (Iterator iter = students.iterator(); iter.hasNext();) {
String name = (String) iter.next();
System.out.println(name);
}

/*// 2.查询多个属性,其集合元素是对象数组
// 数组元素的类型和对应的属性在实体类中的类型一致
// 数组的长度取决与select中属性的个数
List students = session.createQuery("select id, name from Student")
.list();
for (Iterator iter = students.iterator(); iter.hasNext();) {
Object[] obj = (Object[]) iter.next();
System.out.println(obj[0] + "," + obj[1]);
}*/

/*// 3.如果认为返回数组不够对象化,可以采用hql动态实例化Student对象
// 此时list中为Student对象集合,需要在domain中增加Constructor
List<Student> students = (List<Student>)session.createQuery("select new Student(id, name) from Student").list();
for (Iterator<Student> iter = students.iterator(); iter.hasNext();) {
Student student = iter.next();
System.out.println(student.getId() + "," + student.getName());
}*/

/*// 4.可以使用别名,可以使用as
List students = session.createQuery("select s.id, s.name from Student s").list();
for (Iterator iter = students.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().rollback();
} finally {
HibernateUtil.close(session);
}
}


2.条件查询

@Test
public void testQuery4(){
Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

// 1. 参数
/*List students = session.createQuery("from Student where name like ? ")
.setParameter(0, "%"+"1"+"%")
.list();*/

// 2.参数名称
List students = session.createQuery("from Student where name like :myname and classes.name like '%5%'")
.setParameter("myname", "%"+"1"+"%")
.list();

// 3. 参数数组
/*List students = session.createQuery("from Student where classes.id in (:classIds)")
.setParameterList("classIds", new Integer[]{1,2,3})
.list();*/

// 4. 使用数据库函数,不推荐使用,移植性不好
/*List students = session.createQuery("from Student where date_format(createTime,'%Y-%m') = ?")
.setParameter(0, "2008-02")
.list();*/

for (Iterator iter=students.iterator(); iter.hasNext();) {
Student student = (Student)iter.next();
System.out.println(student.getName() +"	"+ student.getCreateTime());
}

session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateUtil.close(session);
}
}


3.原生Sql查询

@Test
public void testQuery5(){
Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();

// 返回的是对象数组
List students = session.createSQLQuery("select id, name from t_student")
.list();

for (Iterator iter=students.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().rollback();
} finally {
HibernateUtil.close(session);
}
}


4.外置命名查询

参见顶部的hbm.xml,配置在query标签下配置命名

需要注意的是,命名不能重复,并且可以在任意的hbm.xml文件中存在

@Test
public void testQuery6(){
Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();

// 返回的是对象数组
List students = (List) session.getNamedQuery("Student.searchStudents")
.setParameter(0, 10)
.list();

for (Iterator iter=students.iterator(); iter.hasNext();) {
Student student = (Student)iter.next();
System.out.println(student.getName() +"	"+ student.getCreateTime());
}

session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateUtil.close(session);
}
}


5.Filter的使用,使用不多

注意,filter的作用域仅限于当前对象,并且命名不能含有.

过滤器中的参数,必须全部赋值,该功能并不常用,因为不能动态生成where语句

@Test
public void testQueryFilter(){
Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();

session.enableFilter("filter").setParameter("myid", 10);

List students = session.createQuery("from Student").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Student student = (Student)iter.next();
System.out.println(student.getName());
}

session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateUtil.close(session);
}
}


6.Filter的使用,分页

@Test
public void testQueryPaging(){

Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();

session.enableFilter("filter").setParameter("myid", 10);

List students = session.createQuery("from Student")
.setFirstResult(1)
.setMaxResults(2)
.list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Student student = (Student)iter.next();
System.out.println(student.getName());
}

session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateUtil.close(session);
}

}


7.连接查询

@Test
public void testQueryJoin(){

Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();

session.enableFilter("filter").setParameter("myid", 10);

// 此处是内连接, hql 相等于 select c, s from Student s inner join s.classes c
List students = session.createQuery("select c, s from Classes c join c.students s")
.list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Object[] obj = (Object[])iter.next();
System.out.println(((Classes)obj[0]).getName() + "	" + ((Student)obj[1]).getName());
}

// 左连接:左边的表都显示出来select c, s from Classes c left join c.students s
// 右连接:右边的表都列出来select c.name, s.name from Classes c right join c.students s
/*List students = session.createQuery("select c.name, s.name from Classes c right join c.students s")
.list();
for (Iterator iter=students.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().rollback();
} finally {
HibernateUtil.close(session);
}

}


8.统计查询

@Test
public void testQueryStatistics(){

Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();

/*List students = session.createQuery("select count(*) from Student")
.list();
Long count = (Long)students.get(0);
System.out.println("Students.cound = "+count);*/

//如果返回值是单一值,可以调用uniqueResult()
/*Long count = (Long)session.createQuery("select count(*) from Student").uniqueResult();
System.out.println("Students.cound = "+count);*/

List statistics = session.createQuery("select c.name, count(s) from Student s join s.classes c" +
" group by c.name order by c.name").list();
for (Iterator iter = statistics.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().rollback();
} finally {
HibernateUtil.close(session);
}

}


9.DML风格的查询,尽量不用,因为缓存不同步
需要在找到一个和缓存同步的方法

@Test
public void testQueryDml(){

Session session = null;
try {
session = HibernateUtil.openSession();
session.beginTransaction();

session.createQuery("update Student s set s.name=? where s.id < ?")
.setParameter(0, "Scott")
.setParameter(1, 5)
.executeUpdate();

session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally {
HibernateUtil.close(session);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: