Hibernate 查询方式(HQL/QBC/QBE)汇总
作为老牌的 ORM 框架,Hibernate 在推动数据库持久化层所做出的贡献有目共睹。
它所提供的数据查询方式也越来越丰富,从 SQL 到自创的 HQL,再到面向对象的标准化查询。
虽然查询方式有点眼花缭乱,配置使用起来也稍微有点复杂。
但是丝毫掩盖不了它迷人的地方,本篇博客试着汇总 Hibernate 所有的查询方式。
萝卜青菜各有所爱,工作中可以根据自己的喜好选择其中的几种进行编程。
1. HQL 方式,参数使用问号占位(4.1 版本中已被废弃)
public List<UserPO> getUserList(UserPO userPO) {
String hql = "from UserPO where name = ? and passwd= ?";
Query query = getHibernateSession().createQuery(hql);
query.setParameter(0, userPO.getName());
query.setParameter(1, userPO.getPasswd());
return query.list();
}
2. HQL 方式,参数使用命名占位
public List<UserPO> getUserList(UserPO userPO) {
String hql = "from UserPO where name = :userName and passwd= :userPwd";
Query query = getHibernateSession().createQuery(hql);
query.setParameter("userName", userPO.getName());
query.setParameter("userPwd", userPO.getPasswd());
return query.list();
}
3. HQL 方式,参数使用 JPA 占位符
public List<UserPO> getUserList(UserPO userPO) {
String hql = "from UserPO where name = ?1 and passwd= ?2";
Query query = getHibernateSession().createQuery(hql);
query.setParameter("1", userPO.getName());
query.setParameter("2", userPO.getPasswd());
return query.list();
}
4. HQL 方式,参数使用对象绑定
public List<UserPO> getUserList(UserPO userPO) {
String hql = "from UserPO where name = :name and passwd= :passwd";
Query query = getHibernateSession().createQuery(hql);
query.setProperties(userPO);
return query.list();
}
PS:需要注意的是命名参数占位要与PO属性一致,而且只能使用参数命名占位的方式。
当然上述的 1--4 填充查询方式,HQL 都可以调整为 SQL 是相通的(使用 createSQLQuery)。
5. QBC(Query By Criteria) 方式,参数使用 Restrictions 对象
public List<UserPO> getUserList(UserPO userPO) {
Criteria criteria = getHibernateSession().createCriteria(UserPO.class);
criteria.add(Restrictions.eq("name",userPO.getName()));
criteria.add(Restrictions.eq("passwd",userPO.getPasswd()));
return criteria.list();
}
6. QBC(Query By Criteria) 方式,参数使用对象绑定
public List<UserPO> getUserList(UserPO userPO) {
Criteria criteria = getHibernateSession().createCriteria(UserPO.class);
criteria.add(Example.create(userPO));
return criteria.list();
}
PS: QBC(Query By Criteria) 方式,使用到的关键抽象对象有:
Restrictions --> 设置查询限制条件
Order --> 设置查询排序条件
Projections --> 工具类的方法进行统计和分组。
上述 5-6 也是我最喜欢的方式,用面向对象查询方式来迎合面向对象的编程。
当查询条件中都是等于的时候,使用方法6,代码是相当简洁优雅的。
如果查询条件中含有其他判断限制,如>、<、like、between 时,使用方式 5 也是不错的选择。
但出现特殊情况,如属性字段为时间类型,因各数据库对时间字段的的规范和类型不同。
填充 PO 时间类型属性后,无法精准的使用方式 5/6 进行时间查询的判断限制,这时需要从 1-4 方式中变通一下。
7. 离线条件查询
public List<UserPO> getUserList(UserPO userPO) {
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(UserPO.class);
detachedCriteria.add(Restrictions.eq("name",userPO.getName()));
detachedCriteria.add(Restrictions.eq("passwd",userPO.getPasswd()));
Criteria criteria = detachedCriteria.getExecutableCriteria(getHibernateSession());
return criteria.list();
}
离线查询的好处,可以将查询对象 DetachedCriteria 作为参数传递到 DAO层,减少 DAO 层代码
8. QBC(Query By Criteria) 方式,分页查询
public List<UserPO> getUserList(UserPO userPO) {
Criteria criteria = getSession().createCriteria(UserPO.class);
criteria.setFirstResult(4);
criteria.setMaxResults(3);
return criteria.list();
}
}
PS: 分页查询主要是要指定两个参数(从什么开始,取多少条):
Query或者Criteria对象的 setFirstResult()和setMaxResults()
当然8中的 Criteria 对象也可以换为 Query 对象,使用 HQL 或者 SQL 查询方式。
Hibernate 查询方式(HQL/QBC/QBE)汇总的更多相关文章
- Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询
HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...
- hibernate查询方式
hibernate查询方式:1.本地SQL查询 2.HQL查询 3.QBC查询 HQL查询:是面向对象的查询语言,是使用最广的一种查询方法 QBC查询:Query by Criteria是一套接口来实 ...
- (十)Hibernate 查询方式
所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 第一节:Hibernate 查询方式简介 1,导航对象图查询方式: 2 ...
- Hibernate查询方式(补)
-----------------siwuxie095 Hibernate 查询方式 1.对象导航查询 根据已经加载的对 ...
- Hibernate学习10——Hibernate 查询方式
本章主要是以查询Student的例子: Student.java: package com.cy.model; public class Student { private int id; priva ...
- Hibernate 查询方式、JPA查询方式
hibernate 查询方式: OID 查询 对象导航查询 HQL 方式查询 QBC方式查询 原生SQL方式查询 JPA 查询方式: OID 查询 对象导航查询 JPQL 方式查询 CriteriaB ...
- hibernate 查询方式汇总
主要摘自 http://blog.sina.com.cn/s/blog_7ffb8dd501014a6o.html ,http://blog.csdn.net/xingtianyiyun/artic ...
- Hibernate查询方式汇总
Hibernate总的来说共有三种查询方式:HQL.QBC和SQL三种.但是细分可以有如下几种: 一.HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的 ...
- Hibernate -- 检索方式 HQL
Hibernate 提供了以下几种检索对象的方式 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的OID 来检索对象 HQL 检索方式:使用面向对象的HQL查询 ...
随机推荐
- .NET Core Windows环境安装与体验
1.安装.NET Core SDK 在windows下开发.NET Core最好使用Visual Studio工具.下载地址与安装: VS2015最新版本:Visual Studio 2015 Upd ...
- 在真机调试 iOS 应用:理解 Certificates, Identifiers & Profiles
No matching provisioning profiles found. No matching code signing identity found. Your account alrea ...
- LinqToDB 源码分析——轻谈Linq查询
LinqToDB框架最大的优势应该是实现了对Linq的支持.如果少了这一个功能相信他在使用上的快感会少了一个层次.本来笔者想要直接讲解LinqToDB框架是如何实现对Linq的支持.写到一半的时候却发 ...
- 大话keepalive
大话keepalive 我们说到keepalive的时候,需要先明确一点,这个keepalive说的是tcp的还是http的. tcp的keepalive是侧重在保持客户端和服务端的连接,一方会不定期 ...
- agsXMPP
agsXMPP使用 agsXMPP中的例子已经有注册.登录.添加好友.接收好友添加请求.发送消息.接收消息等功能. 修改用户密码 登录后可用以下方法修改密码 IQ iq = new IQ(IqType ...
- 设计模式(七)适配器模式(Adapter Pattern)
一.引言 在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象.那么如果将“将现存的对象”在新的环境中进行调用 ...
- apache.commons.io.IOUtils: 一个很方便的IO工具库(比如InputStream转String)
转换InputStream到String, 比如 //引入apache的io包 import org.apache.commons.io.IOUtils; ... ...String str = IO ...
- 使用visualvm远程监控JVM LINUX服务器配置方法
(1)首先要修改JDK中JMX服务的配置文件,以获得相应的权限: 进入$JAVA_HOME所在的根目录的/jre/lib/management子目录下, a. 将jmxremote.password. ...
- MySQL数据库不能远程访问的解决办法
MySQL数据库不允许从远程访问怎么办? 下面提供两种方法: 1.改表法 MySQL的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 ...
- Dynamics CRM 之ADFS 使用 WID 和代理的联合服务器场
为此部署拓扑 Active Directory 联合身份验证服务 (AD FS) 等同于联合服务器场与 Windows 内部数据库 (WID) 拓扑中,但它将代理服务器计算机添加到外围网络,以支持外部 ...