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