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); 
         
    }     
     
}

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/12111.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论