zoukankan      html  css  js  c++  java
  • Hibernate查询方法总结

    1. HQL查询

    HQL是Hiberante官方推荐的Hibernate检索方式,它使用类似SQL的查询语言,以面向对象的方式从数据库中查询。可以使用HQL查询具有继承、多态和关
    关系的数据。在检索数据时应优先考虑使用HQL方式。
    hibernate的session.createQuery()方法是使用HQL语句查询对象的。     
    hql:是查询对象的,例如:"from Person",其中from不区分大小写,Person是区分大小写,因为它是对象。是Person。返回Query对象。执行这条语句后,Hibernate会根据配置文件中所配置的数据库适配器自动生成相应数据库的SQL语句。
    sql: select * from person;   from 后面是表名
    hql: form Person;   from 后面是类。可以对类起别名,有两种方法。hql: from Person p hql:from Person as p
    Session s = sessionFactory.openSession();
    String strQuery = "from Person where name=:name";
    Query query = s.createQuery(strQuery);
    query.setString("name", "张三");
    List<Person> lst = query.list();
    for(Person p : lst){
    <span style="white-space:pre">	</span>System.out.println(p);
    }
    适用情况:常用方法,比较传统,类似jdbc。缺点:新的查询语言,适用面有限,仅适用于Hibernate框架。

    2. Criteral查询

    Session s = sessionFactory.openSession();
    Criteria criteria = s.createCriteria(Person.class);
    criteria.add(Restrictions.eq("name", "张三"));
    List<Person> lst = criteria.list();
    for(Person p : lst){
    <span style="white-space:pre">	</span>System.out.println(p);
    }
    适用情况:面向对象操作,革新了以前的数据库操作方式,易读。缺点:适用面较HQL有限。

    3. DetachedCriteria查询

    private List<Person> dc(DetachedCriteria dc){
    <span style="white-space:pre">	</span>Session s = sessionFactory.openSession();
    	Criteria criteria = dc.getExecutableCriteria(s);
    	return criteria.list();
    }
    DetachedCriteria dc = DetachedCriteria.forClass(Person.class);
    dc.add(Restrictions.eq("name", "张三"));
    List<Person> lst = dc(dc);
    for(Person p : lst){
    <span style="white-space:pre">	</span>System.out.println(p);
    }
    适用情况:面向对象操作,分离业务与底层,不需要字段属性摄入到Dao实现层。  缺点:适用面较HQL有限。

    4. Example 查询

    Person p = new Person();
    p.setName("张三");
    //p.setName("张%");
    Session s = sessionFactory.openSession();
    Criteria c = s.createCriteria(Person.class);
    Example example = Example.create(p);
    example.excludeProperty("age");//排除年龄属性
    example.excludeProperty("birthDay");
    example.excludeProperty("id");
    //example.enableLike();//启用模糊查询
    List<Person> list = c.add(example).list();
    for(Person p1 : list){
    	System.out.println(p1);
    }
    适用情况:面向对象操作。   缺点:适用面较HQL有限,不推荐。

    5. sql查询

    Session s = sessionFactory.openSession();
    String strQuery = "select * from person where pname=:name";//条件应为表的属性
    Query query = s.createSQLQuery(strQuery).addEntity(Person.class);
    //java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to hibernate.entity.Person
    query.setString("name", "张三");
    List<Person> list =	query.list();
    for(Person p1 : list){
    	System.out.println(p1);
    }
    适用情况:不熟悉HQL的朋友,又不打算转数据库平台的朋友,万能方法   缺点:破坏跨平台,不易维护,不面向对象,查询条件的属性应和平常的SQL一样,采用表的属性。

    6. 命名查询

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC
            '-//Hibernate/Hibernate Mapping DTD 3.0//EN'
            'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>
    <hibernate-mapping>
        <class name="hibernate.entity.Person" table="person">
            <id name="id" column="pid"></id>
            <property name="name" column="pname"></property>
    	<property name="birthDay" type="date" ></property>
    	<property name="age"></property>
        </class>
        <query name="getPersonByName">  
      	<![CDATA[from Person where name=:name]]>  
        </query>
    </hibernate-mapping>
    Session s = sessionFactory.openSession();
    Query HQLquery = s.getNamedQuery("getPersonByName");
    HQLquery.setString("name", "张三");
    List<Person> list =	HQLquery.list();
    for(Person p1 : list){
    	System.out.println(p1);
    }
    适用情况:万能方法,有点像ibatis轻量级框架的操作,方便维护。  缺点:不面向对象。基于hql和sql,有一定缺陷。

    上述六种查询方法,HQL查询,SQL查询,命名查询比较好用。
  • 相关阅读:
    Delphi 窗体失踪在最上面的代码
    Delphi 目前使用delay函数功能
    Delphi Delay 延时计数的功能。 下面的方法都是思路,但是没有用在项目上
    Delphi 通过SQLite3, SQLiteTable3 操作数据库
    解决sqlite删除数据后,文件大小不变问题 转载
    delphi执行cmd命令和bat文件
    Delphi 获取sqlite中所有的表名
    delphi 获取USB口拔出和插入的状态
    深度揭密轮播插件核心代码的实现过程
    flowJS源码个人分析
  • 原文地址:https://www.cnblogs.com/marcotan/p/4256932.html
Copyright © 2011-2022 走看看