• Hibernate-ORM:14.Hibernate中的命名查询


    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

    本篇博客讲述命名查询,所谓命名查询是什么呢?

    Hibernate中允许我们在xml,实体类,甚至注解的方式来编写查询语句,本篇博客将讲述xml中的方式

    一,准备好准备工作,我由于上篇博客把大量的准备都做好,所以,本篇从简

    二,预览hbm.xml

    <?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="cn.dawn.day05.entity">
        <!--如果上面指定package的话,class的name就不必写全类名-->
        <!--lazy:是否懒加载(延迟加载)        默认值是true,延迟加载-->
        <!--<class name="Teacher">-->
        <!--直接加载-->
        <class name="Emp" lazy="false">
            <!--主键-->
            <id name="empId" column="empId">
                <!--主键生成策咯  assigned程序员自己创建-->
                <!--identity是mysql里的自增,一会做增加操作不必再给主键赋值-->
                <!--increment是先查最大的主键列,在下一条给主键加一-->
                <!--sequence是oracle的主键生成策咯,他一会需要指定序列名字<param name="sequence">序列名</param>-->
                <generator class="assigned"></generator>
            </id>
            <property name="name"/>
            <property name="sal"/>
            <property name="job"/>
            <!--table指的是中间表,承载关联关系的表-->
    
                <!--另外与他有多对多关联的实体类-->
            <many-to-one name="dept" column="deptNo" class="Dept"/>
        </class>
    
        <!--hql-->
        <!--HQL命名查询-->
        <query name="getAllEmps">
            <!--这个符号表示不编译关键字,比如大于号小于号等-->
            <![CDATA[
                from Emp
            ]]>
        </query>
        <!--SQL命名查询,返回的是一个Object数据-->
        <sql-query name="getAllEmpsBySql">
            <!--这个符号表示不编译关键字,比如大于号小于号等-->
            <![CDATA[
                select * from emp
            ]]>
        </sql-query>
        <!--查询中携带条件-->
        <sql-query name="getAllEmpById">
            <!--这个符号表示不编译关键字,比如大于号小于号等-->
            <![CDATA[
                select * from emp where empId=:id
            ]]>
        </sql-query>
        <!--查询返回一个对象-->
        <sql-query name="getEmpObject">
            <return-scalar column="empId"/>
            <return-scalar column="name"/>
            <return-scalar column="sal"/>
            <return-scalar column="job"/>
            <!--但是无法绑定关联对象-->
            <!--这个符号表示不编译关键字,比如大于号小于号等-->
            <![CDATA[
                select * from emp where empId=:id
            ]]>
        </sql-query>
    </hibernate-mapping>

    三,查全部使用HQL语句(用命名查询)

      1.在xml中使用到的方法是这个:

        <!--hql-->
        <!--HQL命名查询-->
        <query name="getAllEmps">
            <!--这个符号表示不编译关键字,比如大于号小于号等-->
            <![CDATA[
                from Emp
            ]]>
        </query>

        此处需要注意的就是<![CDATA[      ]]>这个标签,它表示不以关键字的形式编译里面的字符,例如<小于号在xml不以尖括号的形式编译

      2.单测方法:

        @Test
        /*HQL命名查询*/
        public void t1HQLnamedquery(){
            List<Emp> emps = session.getNamedQuery("getAllEmps").list();
            for (Emp emp:emps){
                System.out.println(emp);
            }
            /*
            Hibernate: select emp0_.empId as empId1_1_, emp0_.name as name2_1_, emp0_.sal as sal3_1_, emp0_.job as job4_1_, emp0_.deptNo as deptNo5_1_ from Emp emp0_
            Hibernate: select dept0_.deptId as deptId1_0_0_, dept0_.name as name2_0_0_, dept0_.location as location3_0_0_ from Dept dept0_ where dept0_.deptId=?
            Hibernate: select dept0_.deptId as deptId1_0_0_, dept0_.name as name2_0_0_, dept0_.location as location3_0_0_ from Dept dept0_ where dept0_.deptId=?
            Emp{empId=1, name='a', job='财务猿1', sal=10000.0, dept=Dept{deptId=1, name='xx部', location='1楼'}}
            Emp{empId=2, name='Ab', job='财务猿2', sal=5000.0, dept=Dept{deptId=1, name='xx部', location='1楼'}}
            Emp{empId=3, name='bAa', job='财务猿3', sal=6000.0, dept=Dept{deptId=1, name='xx部', location='1楼'}}
            Emp{empId=4, name='aaA', job='程序猿1', sal=100000.0, dept=Dept{deptId=2, name='研发部', location='2楼'}}
            Emp{empId=5, name='aB', job='程序猿2', sal=50000.0, dept=Dept{deptId=2, name='研发部', location='2楼'}}
            Emp{empId=6, name='AC', job='程序猿3', sal=60000.0, dept=Dept{deptId=2, name='研发部', location='2楼'}}
            Emp{empId=7, name='AD', job='Boss', sal=5000000.0, dept=null}
            * */
        }

    四,查全部使用SQL语句(用命名查询)

      1.xml中

        <!--SQL命名查询,返回的是一个Object数据-->
        <sql-query name="getAllEmpsBySql">
            <!--这个符号表示不编译关键字,比如大于号小于号等-->
            <![CDATA[
                select * from emp
            ]]>
        </sql-query>

      2.单测方法:

        @Test
        /*SQL命名查询,返回的是一个Object数据*/
        public void t2HQLnamequeryBySQL(){
            List<Object[]> list=session.getNamedQuery("getAllEmpsBySql").list();
            for(Object[] emp:list){
                System.out.println(emp[0]);//id
                System.out.println(emp[1]);//name
                /*System.out.println(emp[2]);//sal*/
            }
    
            /*
            Hibernate: select * from emp
            1
            a
            2
            Ab
            3
            bAa
            4
            aaA
            5
            aB
            6
            AC
            7
            AD
            * */
        }

    五,带条件查询(用命名查询,返回的是List<Object[]>

      1.xml中:

        <!--查询中携带条件-->
        <sql-query name="getAllEmpById">
            <!--这个符号表示不编译关键字,比如大于号小于号等-->
            <![CDATA[
                select * from emp where empId=:id
            ]]>
        </sql-query>

      2.单测方法:

        @Test
        /*查询中携带条件*/
        public void t3HQLnamedqueryByParamter(){
            List<Object[]> list = session.getNamedQuery("getAllEmpById").setParameter("id", 1).list();
            for(Object[] emp:list){
                System.out.println(emp[0]);//id
                System.out.println(emp[1]);//name
                /*System.out.println(emp[2]);//sal*/
            }
    
            /*
            Hibernate: select * from emp where empId=?
            1
            a
            * */
        }

    六,带条件查询,返回的是Object(使用命名查询)

      1.xml中:

        <!--查询返回一个对象-->
        <sql-query name="getEmpObject">
            <return-scalar column="empId"/>
            <return-scalar column="name"/>
            <return-scalar column="sal"/>
            <return-scalar column="job"/>
            <!--但是无法绑定关联对象-->
            <!--这个符号表示不编译关键字,比如大于号小于号等-->
            <![CDATA[
                select * from emp where empId=:id
            ]]>
        </sql-query>

      2.单测方法:

        @Test
        /*查询返回一个对象*/
        public void t4HQLnamedqueryReturnOneObj(){
            Query query = session.getNamedQuery("getEmpObject").setParameter("id", 1);
            /*把查询出来的结果集转换成指定的对象*/
            query.setResultTransformer(Transformers.aliasToBean((Emp.class)));
            Emp emp = (Emp)query.uniqueResult();
            System.out.println(emp);
    
            /*
            Hibernate: select * from emp where empId=?
            Emp{empId=1, name='a', job='财务猿1', sal=10000.0, dept=null}
            * */
        }
  • 相关阅读:
    解释基于注解的切面实现?
    @Controller 注解?
    Spring由哪些模块组成?
    解释AOP模块 ?
    什么是Spring的依赖注入?
    自动装配有哪些局限性 ?
    在Spring框架中如何更有效地使用JDBC?
    @Autowired 注解?
    @Required 注解?
    解释AOP?
  • 原文地址:https://www.cnblogs.com/DawnCHENXI/p/9141422.html
Copyright © 2020-2023  润新知