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}
        * */
    }

原文地址:https://www.cnblogs.com/DawnCHENXI/p/9141422.html

时间: 2024-10-10 09:05:46

Hibernate-ORM:14.Hibernate中的命名查询的相关文章

Hibernate ORM框架——Hibernate查询

MySQL数据库-------------------------------------------------- use demo; select * from CLASSINFO; select * from persons; delete from CLASSINFO; delete from persons; insert into CLASSINFO values('c111','banji1'); insert into CLASSINFO values('c222','banji

[原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Hibernate命名查询

什么是命名查询? Hibernate允许在映射文件中定义字符串形式的查询语句,这种查询方式成为命名查询 使用命名查询有什么好处? 由于使用Hibernate的HQL常常需要在Java代码中写字符串查询语句,HQL混杂在代码之间,破坏代码可读性,通过使用命名查询,可以使业务逻辑和查询语句分离,使您专注于查询,而避免了 SQL 或者 HQL 代码分散于整个应用程序中的情况. 可以应用命名查询做复杂查询的处理 命名查询如何实现? 介绍下面几种方式: 方法一:在配置文件中<class/>标记的下面,声

12.hibernate命名查询

1.创建如下javaweb项目结构 2.在项目的src下创建hibernate.cfg.xml主配置文件 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourc

Hibernate(十三)命名查询-批量处理和调用存储过程

一.命名查询 HQL语句混杂在代码之间将破坏代码的可读性 Hibernate允许在映射配置文件中定义字符串形式的查询语句,这种查询方式称为命名查询 二.建立数据表和持久化类 建立数据表 create table login ( username varchar2(32) primary key, password varchar2(32) not null , age number(3) ); insert into login select '张三','123456',21 from dual

Hibernate中的HQL查询与缓存机制

HQL:完全面向对象查询 SQL的执行顺序: 1.From 2.Where 过滤基础数据 where与having的区别:1.顺序不同 2.where过滤基础数据 3. 过滤聚合函数 3.Group by 4.Select 5.Having 6.Order by   使用Hibernate查询时,使用hibernate的一个接口query Hql是面向对象的查询语句,所以跟的是类名 Query query = session.createQuery("select id,name,stu.cla

Hibernate异常之命名查询节点未找到

异常信息: 1 java.lang.IllegalArgumentException: No query defined for that name [salaryEmps] 2 at org.hibernate.internal.AbstractSharedSessionContract.getNamedQuery(AbstractSharedSessionContract.java:578) 3 at org.hibernate.internal.AbstractSharedSessionC

Hibernate中的条件查询完毕类

Hibernate中的条件查询有下面三个类完毕: 1.Criteria:代表一次查询 2.Criterion:代表一个查询条件 3.Restrictions:产生查询条件的工具类

Hibernate中的条件查询完成类

Hibernate中的条件查询有以下三个类完成: 1.Criteria:代表一次查询 2.Criterion:代表一个查询条件 3.Restrictions:产生查询条件的工具类 Hibernate中的条件查询完成类