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查询,命名查询比较好用。