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

Hibernate查询方法总结的更多相关文章

  1. Hibernate 查询方法

    1.简单查询: public User select(User user) { User newUser; try { newUser = (User) session.get(User.class, ...

  2. J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())

    J2EE进阶(十七)Hibernate中常用的HQL查询方法(getHibernateTemplate())   当我们使用Hibernate进行数据的CRUD操作时,利用模版进行操作不失为一种方法. ...

  3. hibernate查询竟然有6种方法

    hibernate查询的6种方法 1.HQL查询 2.对象化查询Criteria方法 3.动态查询DetachedCriteria 4.例子查询 5.sql查询 6.命名查询 1.HQL查询 stat ...

  4. Hibernate查询出现java.lang.IllegalArgumentException异常解决方法

    Hibernate查询出现java.lang.IllegalArgumentException. 异常信息如下:java.lang.IllegalArgumentException        at ...

  5. Hibernate查询对象的方法浅析

    Hibernate 查询对象是根据对象的id查询的,只要你有id (id唯一),则无论你是否其他字段与传过来的对象一致,都会查到该id在数据库对应的对象.若是在关联查询中,所关联表的id为空,即所查表 ...

  6. Hibernate查询

    HIbernate查询 使用get方法 使用get方法通过持久类名和ID号查找一个对象Stu instance = (Stu) getsession() .get("com.lovo.po. ...

  7. hibernate查询方式

    hibernate查询方式:1.本地SQL查询 2.HQL查询 3.QBC查询 HQL查询:是面向对象的查询语言,是使用最广的一种查询方法 QBC查询:Query by Criteria是一套接口来实 ...

  8. 六种方式实现hibernate查询

    最近在学习Hibernate的基本内容,刚好在项目中有用到,基本上都是用到哪就学哪. 今天看看六种方式实现hibernate查询......... 分别是HQL查询,对象化查询Criteria方法,动 ...

  9. 记录使用Hibernate查询bean中字段和数据库列类型不匹配问题

    今天在工程中遇到Hibernate查询的时候,bean中的字段和数据库中的字段不符合(bean中有pageTime字段,但是数据库中没有此列)报错问题. 具体问题环境: 在auto_off表中,off ...

随机推荐

  1. ng表单验证,提交以后才显示错误

    只在提交表单后显示错误信息 有时候不想在用户正在输入的时候显示错误信息. 当前错误信息会在用户输入表单时立即显示. 由于Angular很棒的数据绑定特性,这是可以发生的. 因为所有的事务都可以在一瞬间 ...

  2. 表格td、th强制换行

    表格td.th强制换行 <table style="table-layout:fixed" width="100%"> <tr>< ...

  3. Python深入学习笔记(一)

    写在前面的话 从08年接触Python到现在,断断续续地使用,到如今Python已经成为日常事物处理.科研实验,甚至工程项目的主力语言,主要因为其敏捷性和快速实现的能力.虽然看了一些Python的教程 ...

  4. C# 中的委托和事件 转张子阳

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  5. Using .NET 4's Lazy<T> 实现单实例

    Using .NET 4's Lazy<T> type Explanation of the following code: If you're using .NET 4 (or high ...

  6. C# 实现繁体字和简体字之间的转换

    今天收到一个需求,将一组简体的汉字转换成繁体的汉字,刚开始有点茫然,后来在网上搜了一下思路,结果很少有涉及,终于我在看了MSDN后找到了如何解决,可能这方面对一些高程来说很Easy,但是除了高程还有很 ...

  7. #ifndef#define#endif的用法-b

    The special operator defined is used in #if and #elif expressions to test whether a certain name is ...

  8. shell脚本学习积累笔记(第一篇)

    (1)首先,今天在执行shell脚本./test.sh时抛出“/bin/sh^M: bad interpreter: No such file or directory”的异常,百度后,才知道这是由于 ...

  9. 【网络流24题】No.21 (最长 k 可重区间集问题 最长不相交路径 最大费用流)

    [] 输入文件示例input.txt4 21 76 87 109 13 输出文件示例output.txt15 [分析] 直接co题解好了,写得挺全.. [建模方法] 方法1 按左端点排序所有区间,把每 ...

  10. DHTMLX 前端框架 建立你的一个应用程序教程(二)--设置布局

    Layout控件的演示 Dhtmlx有很多的组建来组织网页的建设, 这篇主要介绍dhtmlxLayout . 下面图片中 布局将各个组件(1.Menu 2.Toolbar 3.Grid 4.Form ...