Hibernate使用HQL查询集合

这篇博客探讨了Hibernate中HQL查询的应用,并通过一个区县与街道的例子展示了延迟加载的效果。当延迟加载设置为true时,查询过程分为两步,先查询第一部分再查询第二部分;而设置为false时,所有SQL语句会一次性执行完毕再进行打印。通过对比,揭示了两种模式下SQL执行的差异。

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

还是以区县和街道为例:
Hibernate.cfg.xml配置

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!--加载数据源-->
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="hibernate.connection.username">root</property> <!-- 账户 -->
        <property name="hibernate.connection.password">xxxx</property> <!-- 密码 -->
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?serverTimezone=GMT%2B8</property>
        <!--加载的是什么数据库-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>  <!-- 打印sql语句 -->
        <property name="hibernate.hbm2ddl.auto">update</property> <!-- 自动建表 -->
        <!--<mapping resource="mapper/User.hbm.xml"></mapping>  &lt;!&ndash; 加载实体类的Mysql对应xml文件 &ndash;&gt;-->
        <!--<mapping resource="mapper/userAdress.hbm.xml"></mapping>  &lt;!&ndash; 加载实体类的Mysql对应xml文件 &ndash;&gt;-->
        <!-- 街道区县 一对多  -->
        <mapping resource="jiedao/jiedao.hbm.xml"></mapping>  <!-- 加载实体类的Mysql对应xml文件 -->
        <mapping resource="jiedao/quxian.hbm.xml"></mapping>  <!-- 加载实体类的Mysql对应xml文件 -->


    </session-factory>
</hibernate-configuration>

区县的配置

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping>
        <class name="com.text.hibernate.jiedao.QuXian" table="quxian">
            <id name="QXId" column="qx_id" type="integer" unsaved-value="null">
                <generator class="assigned"/>
            </id>
            <property name="QXName" column="qx_name" type="string"/>
            <!--lazy="true" 延时加载 默认为true  DUG模式能看出结果 -->
            <set name="jieDaoSet" cascade="save-update" inverse="true" lazy="true">
                <key column="qx_id"/>
                <one-to-many class="com.text.hibernate.jiedao.JieDao"/>
            </set>
        </class>
    </hibernate-mapping>

街道的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.text.hibernate.jiedao.JieDao" table="jiedao" >
        <id name="JDId" column="jd_id" type="integer">
            <generator class="assigned"/>
        </id>
        <property name="JDName" column="jd_name" type="string"/>
        <many-to-one name="quXian" class="com.text.hibernate.jiedao.QuXian" column="qx_id"/>
    </class>
</hibernate-mapping>

测试类

public class HQLdemo4 {
    public static void main(String[]args){
        Session session = HibernateUtils.getSession();
        // 分页查询
        /*String myHql1 = " from JieDao jd";
        Query query = session.createQuery(myHql1);
        query.setFirstResult(1);
        query.setMaxResults(2);
        List<JieDao> jieDaos = query.list();
        jieDaos.forEach(System.out::println);
        */
        // 聚合函数
        /*String myHql2 = " select count(jd.JDId) from JieDao jd";
        Query query = session.createQuery(myHql2);
        Long rowCount = (Long)query.uniqueResult();
        System.out.println(rowCount);*/

        // 按条件查询
       /* String myHql3 = " from JieDao jd where jd.JDName=:name";
        Query query = session.createQuery(myHql3);
        query.setString("name","街");
        List<JieDao> jieDaos = query.list();
        jieDaos.forEach(System.out::println);*/

       // 模糊查询
        /*String myHql4 = " from JieDao jd where jd.JDName like ?";
        Query query = session.createQuery(myHql4);
        query.setString(0,"街道%");
        List<JieDao> jieDaos = query.list();
        jieDaos.forEach(System.out::println);*/

        //返回部分字段
       /* String myHql5 = " select jd.JDId,jd.JDName from JieDao jd";
        Query query = session.createQuery(myHql5);
        List<Object[]> objects = query.list();
        for (Object[] oneOjb:objects){
            System.out.println("id为="+oneOjb[0]);
            System.out.println("名字为="+oneOjb[1]);
        }*/
       // 延迟查询
        /*String myHql6 = " from QuXian qx where qx.QXName=:name";
        Query query = session.createQuery(myHql6);
        query.setString("name","锦江区");
        List<QuXian> quXians = query.list();
        for (QuXian quXian:quXians){
            System.out.println(quXian);
            System.out.println(quXian.getJieDaoSet());
        }*/
    }
}

这里看一下延迟查询
当设置为true时:
在这里插入图片描述
结果为:
在这里插入图片描述

当设置为flase时:
在这里插入图片描述
结果为:
在这里插入图片描述
经过对比可以看出Sql语句的区别,
当设置为true时:
查询第一个打印完成后再去查询第二个再打印
当设置为false时:
执行Sql语句,Sql语句执行完成后再打印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值