孙卫琴的《精通JPA与Hibernate》的读书笔记:JPQL检索方式的基本用法

本文是关于孙卫琴《精通JPA与Hibernate》的读书笔记,重点介绍了JPQL的基础用法,包括查询条件设定、投影、分页、连接、分组、函数、子查询和动态绑定参数。通过示例展示了JPQL与SQL的异同,指出JPQL面向对象特性,而SQL直接对应数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JPQL(JPA Query Language)是面向对象的查询语言,它和SQL查询语言有些相似。在JPA提供的各种检索方式中,JPQL是使用最广的一种检索方式。它具有以下功能:

  • 在查询语句中设定各种查询条件。
  • 支持投影查询,即仅检索出对象的部分属性。
  • 支持分页查询。
  • 支持连接查询。
  • 支持分组查询,允许使用having和group by关键字。
  • 支持调用各种函数。
  • 支持子查询,即嵌入式查询。
  • 支持动态绑定参数。

以下程序代码用于检索姓名为“Tom”,并且年龄为21的Customer对象:

//创建一个Query对象
Query query=entityManager.createQuery(
      "from Customer as c where c.name=:customerName "
      +"and c.age=:customerAge");
//动态绑定参数
query.setParameter("customerName","Tom");
query.setParameter("customerAge",21);

//执行查询语句,返回查询结果
List result=query.getResultList();

//遍历访问查询结果
Iterator it=result.iterator();
while(it.hasNext()){
  Customer c=(Customer)it.next(); 
} 

从以上程序代码看出,JPQL检索方式包括以下步骤。

(1)通过EntityManager的createQuery()方法创建一个Query对象,它包含一个JPQL查询语句。JPQL查询语句可以包含命名参数,如“customerName”和“customerAge”都是命名参数。

(2)动态绑定参数。Query接口的setParameter()方法可以为各种数据类型的命名参数赋值。

(3)调用Query的getResultList()方法执行查询语句。该方法返回java.util.List类型的查询结果,在List集合中存放了符合查询条件的持久化对象。对于以上程序代码,当运行Query的getResultList()方法时,Hibernate执行以下SQL查询语句:

select ID,NAME,AGE from CUSTOMERS where NAME='Tom' and AGE=21;

Query接口支持方法链编程风格,它的setParameter()方法以及getResultList()等方法都返回自身实例,而不是返回void类型。如果采用方法链编程风格,将按以下形式访问Query接口:

List result=entityManager.createQuery("……")
                   .setParameter("customerName","Tom")
                   .setParameter("customerAge",21)
                   .getResultList();

可见,方法链编程风格能使程序代码更加简洁。

JPQL与SQL在语法形式上有些相似,例如:
JPQL查询语句:from Customer as c where c.name=‘Tom’ and c.age=21
SQL查询语句:select * from CUSTOMERS where NAME=‘Tom’ and AGE=21;

但JPQL与SQL在本质上是不一样的:

  • JPQL查询语句是面向对象的,Hibernate负责解析JPQL查询语句,然后根据对象-关系映射信息,把JPQL查询语句翻译成相应的SQL语句。JPQL查询语句中的主体是域模型中的类以及类的属性。例如在以上JPQL查询语句例子中,“Customer”是持久化类的名字,“c.age”是持久化类的属性的名字。

  • SQL查询语句是与关系数据库绑定在一起的。SQL查询语句中的主体是数据库表以及表的字段。例如在以上SQL查询语句例子中,“CUSTOMERS”是表的名字,“AGE”是表的字段的名字。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java技术集锦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值