Hibernate HQL和QBC
OID查询
一、什么是OID查询
根据对象的OID主键进行检索
二、OID查询方式
1. get方法
- 当get()方法被调用的时候就会立即发出SQL语句
- 并且返回的对象也是实际的对象
- 使用get()和普通的单条查询并没有多大的区别
- 当查询不到的时候get()返回的是null
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
User user = currentSession.get(User.class, 1L);
System.out.println(user);
transaction.commit();
2. load方法
- 当调用load()方法的时候会返回一个目标对象的代理对象
- 在这个代理对象中只存储了目标对象的ID值
- 只有当调用除ID值以外的属性值的时候才会发出SQL查询的
- 当使用到除ID以外的属性的时候,会发出SQL查询语句
- 当查询不到的时候load()报错 ObjectNotFoundException
Session currentSession = HibernateUtil.getCurrentSession();
Transaction transaction = currentSession.beginTransaction();
User user = currentSession.load(User.class, 1L);
System.out.println(user.getUser_id());
System.out.println(user.getUser_name());
transaction.commit();
对象导航查询
Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。先查询到联系人,就可以通过联系人获取联系人所关联的客户对象。
HQL
一、什么是HQL
HQL查询:Hibernate Query Language,Hibernate的查询语言
- 是一种面向对象的方式的查询语言,语法类似SQL。
- 通过session.createQuery(),用于接收一个HQL进行查询方式。
二、查询
1. 简单查询
- 注意:HQL当中不支持 * 的写法。所以 select * from 类名 是错误的。
- createQuery("from 类名");
@Test
public void test(){
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
2. 别名查询
- 注意:HQL当中不支持 * 的写法。所以 select * from 类名 是错误的。
- createQuery("from 类名 别名");
@Test
public void test2(){
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select c from User c");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
3. 排序查询
- order by 字段 desc/asc
@Test
public void test3(){
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select c from User c order by user_id desc");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
4. 条件查询
(1)位置绑定
根据参数的位置进行绑定条件(不常用)
@Test
public void test4() {
Session session = HibernateUtil.openSession();
// Query query = session.createQuery("from User where user_code=? and user_name=?");
Query query = session.createQuery("from User where user_code=?0 and user_name=?1");
query.setParameter(0, "user1");
query.setParameter(1, "IT666");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
(2)名称绑定
把参数对应的值起一个名称 再去设置名称
@Test
public void test5() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User where user_code=:a and user_name=:b");
query.setParameter("a", "user1");
query.setParameter("b", "IT666");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
5. 投影查询
- 查询对象的某个或某些属性
(1)单个属性
@Test
public void test5() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select c.user_name from User c");
List<Object> list = query.list();
for (Object o : list) {
System.out.println(o);
}
}
(2)多个属性
@Test
public void test6() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select c.user_code,c.user_name from User c");
List<Object[]> list = query.list();
for (Object[] o : list) {
System.out.println(Arrays.toString(o));
}
}
(3)查询多个属性,封装到对象当中,要在类中,提供构造方法
// 提供有参构造器时,尽量也写上无参构造器
public User() {}
public User(String user_code, String user_name) {
this.user_code = user_code;
this.user_name = user_name;
}
@Test
public void test7() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select new User(user_code,user_name) from User c");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
6. 分页查询
@Test
public void test8() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User");
query.setFirstResult(0); // 角标开始位置
query.setMaxResults(2); // 一次查的条数
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
7. 统计查询
(1)查询的结构只有一个
@Test
public void test9() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select count(*) from User");
Object result = query.uniqueResult();
System.out.println(result);
}
(2)分组查询
@Test
public void test10() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("select user_code,count(*) from User group by user_code");
List<Object[]> list = query.list();
for (Object[] o : list) {
System.out.println(Arrays.toString(o));
}
}
8. 多表查询
(1)普通内连接
@Test
public void test11() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User u inner join u.roles");
List<Object[]> list = query.list();
for (Object[] o : list) {
System.out.println(Arrays.toString(o));
}
}
(2)迫切内连接
在普通内连接inner join 后添加一个关键字fetch,通过hibernate将另一个对象的数据,封装该对象中
@Test
public void test12() {
Session session = HibernateUtil.openSession();
Query query = session.createQuery("from User u inner join fetch u.roles");
List<User> list = query.list();
for (User user : list) {
System.out.println(user);
}
}
QBC
一、什么是QBC
Query By Criteria,条件查询。是一种更加面向对象化的查询的方式。
二、查询
1. 简单查询
@Test
public void test() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
2.排序查询
@Test
public void test2() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
// 添加排序
criteria.addOrder(Order.desc("user_id"));
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
3.分页查询
@Test
public void test3() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
// 添加排序
criteria.addOrder(Order.desc("user_id"));
// 分页
criteria.setFirstResult(0);
criteria.setMaxResults(2);
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
4.条件查询
条件
= eq
> gt
>= ge
< lt
<= le
<> ne
like
in
and
or
单个条件
@Test
public void test4() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
// 添加条件
criteria.add(Restrictions.eq("user_code", "user2"));
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
多个条件
@Test
public void test5() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
// 多条件
criteria.add(Restrictions.eq("user_code", "user2"));
criteria.add(Restrictions.like("user_name", "%888"));
List<User> list = criteria.list();
for (User user : list) {
System.out.println(user);
}
}
统计查询

@Test
public void test6() {
Session session = HibernateUtil.openSession();
Criteria criteria = session.createCriteria(User.class);
// 统计查询 只有一个结果
criteria.setProjection(Projections.rowCount());
Object result = criteria.uniqueResult();
System.out.println(result);
}
离线条件查询
- 脱离Session,添加条件
- 可以在外部提前使用DetachedCriteria对象提交设置好条件
- 最后再绑定到session当中
@Test
public void test7() {
DetachedCriteria Criteria = DetachedCriteria.forClass(User.class);
Criteria.add(Restrictions.like("user_name", "%888"));
Session session = HibernateUtil.openSession();
Criteria executableCriteria = Criteria.getExecutableCriteria(session);
List<User> list = executableCriteria.list();
for (User user : list) {
System.out.println(user);
}
}
Hibernate HQL和QBC的更多相关文章
- Hibernate —— HQL、QBC检索方式
一.HQL 检索方式 以双向的一对多来测试 HQL 检索方式.以 Department 和 Employee 为例. 建表语句: CREATE TABLE department ( dept_id ) ...
- Hibernate 检索查询的几种方式(HQL,QBC,本地SQL,集成Spring等)
1.非集成Spring hibernate的检索方式,主要有以下五种. 1.导航对象图检索方式.(根据已经加载的对象,导航到其他对象.) 2.OID检索方式.(按照对象的OID来检索对象.) 3.HQ ...
- weblogic10异常:org.hibernate.hql.ast.HqlToken
转自:http://www.programgo.com/article/68682994452/ 在做查询的时候,报出 org.hibernate.QueryException: ClassNotF ...
- SSH整合报错:org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped[......]
非常诡异的报错,信息如下:org.hibernate.hql.internal.ast.QuerySyntaxException: User is not mapped [select count(* ...
- Hibernate HQL查询:
Hibernate HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查 ...
- Hibernate学习笔记-Hibernate HQL查询
Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...
- 解决Eclipse编译器报错ClassNotFoundException:Org.hibernate.hql.ast.HqlToken
最近开发遇到Eclipse编译器老是报出ClassNotFoundException:Org.hibernate.hql.ast.HqlToken [from User Where id=1] 的错误 ...
- java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.MethodNode(尼玛,蛋疼的错误)
java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.MethodNode \-[M ...
- Hibernate HQL详细说明
1. Hibernate HQL详细说明 1.1. hql一个简短的引论 Hibernate它配备了一种非常强大的查询语言.这种语言看起来非常像SQL.但是不要 要对相位的语法结构似,HQL是很有 ...
随机推荐
- stm32 FSMC-TFTLCD显示
TFTLCD TFT液晶屏常用的通信模式主要有6800模式和8080模式,对于TFT彩屏通常都使用8080并口(简称80并口)模式 8080模式的读写时序其实跟LCD1602或者LCD12864的读写 ...
- Vue框架之组件与过滤器的使用
一.组件的使用 局部组件的使用 打油诗: 1.声子 2.挂子 3.用 var App = { tempalte:` <div class='app'></div>` }; ...
- Hbase Region in transition问题解决
1 hbase hbck -repair 强制修复 如果ok就可以 2 不ok,找到hdfs上对应的该表位置,删除,之后在使用hbase hbck -repair 解决过程: 第一次,使用了方法二, ...
- windows虚拟机性能调整
在通过KVM安装WindowsXP/2003/7/2008操作系统后,由于默认的磁盘驱动(IDE)性能与网卡驱动(RTL8139100M)的性能都极其低下,需要调整,通过加载Redhatvirtio驱 ...
- window kvm 虚拟机的创建
1:开始安装win7 (1) 上传iso文件到/data/iso文件夹中 说明:如果不存在的话, 输入 mkdir -p /data/iso (2) 开始安装 virt-install --name= ...
- 刷题小tips
自从认真做题以后,结合自己的做题体验以及网上前人的总结经验贴,罗列下列的小建议: 1.为了避免每一次都要重复输入测试数据的麻烦,利用输入重定向文件 我是只把标准输入stdin重定位到in.txt,然后 ...
- 本地python环境检查,插件检查及插件安装
电脑windows键+r 输入cmd 在python命令模式下 pip list --可以查看已安装的插件情况 或者用 pip freeze 也可以 卸载插件:pip uninstall *** ...
- Hibernate初探之单表映射——Hibernate概念及插件的安装
什么是ORM ORM(Object/Relationship Mapping):对象/关系映射 为什么要有ORM? 利用面向对象思想编写的数据库应用程序最终都是把对象信息保存在关系型数据库中,于是要编 ...
- 网站添加logo图片
网站添加log图片 第一种方法 这里使用的图片一般为16*16大小的图片 <link rel="shortcut icon" href="http://xxx.xx ...
- java中使用redis --- Hash的简单应用
1.java代码 public class RedisTest01 { public static void main(String[] args) { // connect redis server ...