1. 程式人生 > >hibernate10--命名查詢

hibernate10--命名查詢

關系 -o title methods transform 封裝 無法自動 getname obj

技術分享
<?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);
        
    }    
    
}

hibernate10--命名查詢