3.3.1 查询——JPQL/HQL

本文介绍了JPQL和HQL在Hibernate中的查询机制,这两种查询语言是非类型安全的,而Criteria查询提供了类型安全的选项。在JPQL中,from子句可以直接跟类名,Select子句在查询实体对象时可省略。通过EntityManager或Session可以创建Query对象,支持命名参数和构造器查询。同时,文章提到了函数在HQL/JPQL中的应用,以及如何执行本地SQL查询,但本地SQL查询不被推荐使用。

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

Hibernate查询语言(HQL)和Java Persistence查询语言(JPQL)都是对象模型,它们都将查询语言与SQL类似。JPQL是HQL的子集。JPQL查询始终是一个有效的HQL查询,但反过来则不一定成立。

HQL和JPQL都是非类型安全的执行查询操作的方法。Criteria查询提供了一种类型安全的查询方法

1、JPA Query

通过EntityManager取得javax.persistence.Query 或javax.persistence.TypedQuery

主要接口

Query : 基本的查询对象

TypedQuery : Query的子接口,类型化的查询对象,支持泛型,推荐使用类型化查询

JPQL/HQL

from子句:from 后面可以直接跟着类名,别名不是必须的,where语句就必须在from的后面。

Select子句:查询一个实体对象的时候,不需要select子句

select 别名 from 类名 别名 where 条件

select 别名.属性 from 类名 别名 where 条件

(1)基本查询

Query query = super.entityManager.createQuery("from ArticleType");
List<?> list = query.getResultList();//获取查询结果集合

(2)带参数的查询

  在JPQL/HQL里面,参数如果是 : 开头的 表示【命名参数】,不能用【数字】给参数赋值,而是要使用名字
  如果就是要使用数字来设置参数,则把命名参数改为 ?


(3)使用构造器查询

select new 类名(别名.属性,别名.属性) from类名别名

构造器的这种查询使用较少,把查询出来的部分属性,通过类的构造器传入给对象,创建类名对应的对象。

构造器必须要有【无参构造器】,否则其他创建对象,存储对象到数据库的语句会出问题。以及select的时候new所需要的匹配构造器!

有多个User类的情况下应写全限定类名。


2、Hibernate Query

通过 Session 获取 org.hibernate.query.Query。

除了创建Query对象以及取得结果与JPA不一样,其余设置参数一致

org.hibernate.query.Query query = session.createQuery(...);

3、函数

聚集函数(Aggregate)
count
min
max
sum
avg

标量函数
Concat 字符串连接
SUBSTRING 截取字符串
UPPER 转换为大写
LOWER 转换为小写
TRIM 去掉头尾空格
LENGTH 属性内容的长度
LOCATE 接收两个参数,定位第一个参数的内容,在第二个参数的位置,类似于String里面的indexOf方法。
ABS 绝对值
MOD 求余
SQRT 平方根
CURRENT_DATE 当前日期,没有时分秒
CURRENT_TIME 当前时间,没有年月日
CURRENT_TIMESTAMP 当前日期、时间


注意:虽然HQL/JPQL大部分的函数、查询方式,都跟SQL差不多,只是在HQL/JPQL里面不能使用数据库的字段,只能使用类里面的【属性名】。

eg:

String hql = "select sum(o.number) from OrderItem o where o.order=:order";

String hql = "select size(o.items) from Order o where o.id=:id";

String hql = "select MAXELEMENT(o.items) from Order o where o.id=:id";

4、本地的SQL语句(Native SQL Queries)

不推荐使用。查询结果默认是Object[],可以通过addScalar指定不同的列,返回特定的数据类型。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值