hibernate10--命名查詢
阿新 • • 發佈:2017-07-16
關系 -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--命名查詢