hibernate范例简析-hibernate_hql(三)
1、对象导航查询,在hql中采用 . 进行导航【重要】
参见:ObjectNavQueryTest.java
List students = session.createQuery("select s.name from Student s where s.classes.name like '%1%'").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
String name = (String)iter.next();
System.out.println(name);
}
2、外置命名查询
* 在映射文件中采用<query>标签来定义hql
* 在程序中采用session.getNamedQuery()方法得到hql查询串
参见:Student.hbm.xml、NameQueryTest.java
List students = session.getNamedQuery("searchStudents")
.setParameter(0, 10)
.list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Student student = (Student)iter.next();
System.out.println(student.getName());
}
<hibernate-mapping>
<class name="com.bjsxt.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="filtertest" condition="id < :myid"/>
</class>
<query name="searchStudents">
<![CDATA[
SELECT s FROM Student s where s.id<?
]]>
</query>
<filter-def name="filtertest">
<filter-param name="myid" type="integer"/>
</filter-def>
</hibernate-mapping>
3、连接查询【重要】
* 内连
* 外连接(左连接/右连接)
参见:JoinQueryTest.java
List students = session.createQuery("select c.name, s.name from Student s inner join s.classes c").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Object[] obj = (Object[])iter.next();
System.out.println(obj[0] + "," + obj[1]);
}
===
List students = session.createQuery("select c.name, s.name from Classes c left join c.students s").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Object[] obj = (Object[])iter.next();
System.out.println(obj[0] + "," + obj[1]);
}
===
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]);
}
4、
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);
}