hibernate实例简析-hibernate_hql(三)

本文介绍了Hibernate中的HQL查询技术,包括对象导航查询、外置命名查询和连接查询等核心内容。通过具体示例展示了如何使用HQL进行复杂的数据检索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 &lt; :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);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值