• hibernate10--命名查询


    <?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.bdqn.bean">
        <class name="Emp">  
             <id name="empNo">
              <generator class="assigned"/>
             </id>
             <property name="empName"/>
             <property name="job"/>
             <property name="salary"/>
           <!--配置多对一的关系  -->
           <many-to-one name="dept" column="DEPTNO" class="Dept"/>
        </class>
        <!-- 和class节点是同辈的
        01.HQL命名查询     语句要写在CDATA中 -->
        <query name="fromEmp">
          <![CDATA[   
           from  Emp  
          ]]>
        </query>
        
        <!-- 02.sql命名查询
                  001.如果查询的是所有数据 那么前台接收的时候必须是数组
                  002.投影查询的是时候? 查询一个属性的时候是 object对象  多个 就是object数组
                  003.如果还向把结果集封装成对象  就得使用???
                   query.setResultTransformer(Transformers.aliasToBean(Emp.class));
         -->
        <sql-query name="sqlFromEmp">
          <![CDATA[   
         select *  from  emp  
          ]]>
        </sql-query>
        
        <!-- 查询指定的一个对象的姓名 -->
        <sql-query name="selectName">
          <![CDATA[   
         select empName  from  emp  where empNo=:id
          ]]>
        </sql-query>
        
        <!-- 查询指定的一个对象的姓名和薪水   真的向返回一个对象 -->
        <sql-query name="selectNameAndSal">
          <return-scalar column="empName"/>
          <!-- 
          type属性:类型,如果不写,Hibernate会自动检测。可以写java中类的全名或是写hibernate类型。
          因为我们数据库中的salary 是float类型   无法自动映射 需要我们手动的设置匹配!
        empNo  是number类型  无法自动映射  也 需要我们手动的设置匹配!
        java.lang.Integer:  java的全类名    也可以写成 hibernate类型中的int
        double: hibernate类型
           -->
          <return-scalar column="empNo" type="java.lang.Integer"/>
          <return-scalar column="salary" type="double"/>
          <![CDATA[   
         select empName,empNo,salary  from  emp  where empNo=:id
          ]]>
        </sql-query>
        
        
    </hibernate-mapping>
    public class EmpTest {
        Session session =null;
        Transaction transaction=null;
        
        @Before
        public  void  before(){
             session = HibernateSessionUtil.getCurrentSession();
             transaction= session.beginTransaction();
        }
        
        
        /**
         *  命名查询:  hibernate允许我们在xml映射文件或者类中(使用注解的方式)定义字符串形式的查询语句!
         *    命名查询 可以写 hql也可以是sql语句!   程序不区分命名查询语句的类型(hql,sql),只会根据名称进行查询!
         *     getNamedQuery();  ===>得到我们实现写好的 命名查询!
         */
        @Test
        public  void  test01(){
            List<Emp> list = session.getNamedQuery("fromEmp").list();
            for (Emp emp : list) {
                System.out.println(emp);
            }
        }    
        
        /**
         * 测试 sql-query查询 
         * 
         * 发现的问题?
         * 我们的sql查询语句的结果不能封装成对象  ,只能是Object数组
         */
        @Test
        public  void  test02(){
            List<Object[]> list = session.getNamedQuery("sqlFromEmp").list();
            for (Object[] objects : list) {
                System.out.println(objects[0]);
            }
        }    
        
        /**
         * 查询指定的一个对象的姓名    还有一个参数需要赋值
         * 返回一个Object对象
         */
        @Test
        public  void  test03(){
        String name= (String) session.getNamedQuery("selectName").setParameter("id", 1).uniqueResult();
        System.out.println(name);    
        }    
        
        /**
         * 查询指定的一个对象的姓名和薪水    还有一个参数需要赋值
         * 返回一个Object[]数组
         */
        @Test
        public  void  test04(){
            Object[] obj=  (Object[]) session.getNamedQuery("selectNameAndSal").setParameter("id", 1).uniqueResult();
            System.out.println(obj[0]);    //姓名
            System.out.println(obj[1]);    //薪水
        }    
        /**
         * 查询指定的一个对象的姓名和薪水    还有一个参数需要赋值
         * 返回一个对象  怎么做?
         * 01.在xml文件中在增加 <return-scalar>节点
         * 02.我们在query对象返回来的时候  把结果转换成对象
         * 
         * 
         */
        @Test
        public  void  test05(){
              //获取query对象  并且给参数赋值
              Query query = session.getNamedQuery("selectNameAndSal").setParameter("id", 1);
              //把query查询出来的结果集 转换成 对象
              /**
               * 底层的代码
                 * Creates a resulttransformer that will inject aliased values into 
                 * instances of Class via property methods or fields.
                 * 
                 * public static ResultTransformer aliasToBean(Class target) {
                    return new AliasToBeanResultTransformer(target);
                }
                 */
                
             query.setResultTransformer(Transformers.aliasToBean(Emp.class));
             Emp emp= (Emp) query.uniqueResult();
             System.out.println(emp);
            
        }    
        
    }
  • 相关阅读:
    Replication:The replication agent has not logged a progress message in 10 minutes.
    分区管理
    获取URL最后一个 ‘/’ 之后的字符
    Replication 第四篇:事务复制中Subscriber的主键列是只读的
    窗口和窗口函数
    SQL Server 日期格式和日期操作
    约束4:唯一约束,Check约束和null
    约束3:default约束
    Merge语句中NULL的陷阱
    查询“全部”
  • 原文地址:https://www.cnblogs.com/xtdxs/p/7093583.html
Copyright © 2020-2023  润新知