hibernate10--命名查询

Posted 丿少女梦丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
        
    }    
    
}

以上是关于hibernate10--命名查询的主要内容,如果未能解决你的问题,请参考以下文章

org.hibernate.MappingException 命名查询未知

如何强制 Hibernate 在组件上使用左外连接进行命名查询?

Hibernate HQL 查询:如何将集合设置为查询的命名参数?

Hibernate 命名查询和 Spring Data SQL 注入

Hibernate 命名查询数据库或缓存?

Hibernate-ORM:14.Hibernate中的命名查询