JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。
简单的查询
你可以使用以下语句返回所有Topic对象的记录:
SELECT t FROM Topic t
t表示Topic的别名,在Topic t是Topic AS t的缩写。
如果需要按条件查询Topic,我们可以使用:
SELECT DISTINCT t FROM Topic t WHERE t.topicTitle = ?1
通过WHERE指定查询条件,?1表示用位置标识参数,尔后,我们可以通过Query的setParameter(1, "主题1")绑定参数。而DISTINCT表示过滤掉重复的数据。
如果需要以命名绑定绑定数据,可以改成以下的方式:
SELECT DISTINCT t FROM Topic t WHERE t.topicTitle = :title
这时,需要通过Query的setParameter("title", "主题1")绑定参数。
关联查询:从One的一方关联到Many的一方
返回PollOptions对应的PollTopic对象,可以使用以下语句:
SELECT DISTINCT p FROM PollTopic p, IN(p.options) o WHERE o.optionItem LIKE ?1
这个语法和SQL以及HQL都有很大的区别,它直接实体属性连接关联的实体,这里我们通过PollTopic的options属性关联到PollOption实体上,对应的SQL语句为:
SELECT DISTINCT t0.TOPIC_ID, t0.TOPIC_TYPE, t0.TOPIC_TITLE,
t0.TOPIC_TIME, t0.TOPIC_VIEWS, t0.MULTIPLE, t0.MAX_CHOICES FROM T_TOPIC
t0, T_POLL_OPTION t1 WHERE (((t1.OPTION_ITEM LIKE ?) AND (t0.TOPIC_TYPE
= ?)) AND (t1.TOPIC_ID = t0.TOPIC_ID))
该查询语句的另外两种等价的写法分别是:
SELECT DISTINCT p FROM PollTopic p JOIN p.options o WHERE o.optionItem LIKE ?1
和
SELECT DISTINCT p FROM PollTopic p WHERE p.options.optionItem LIKE ?1
关联查询:从Many的一方关联到One的一方
从Many一方关联到One一方的查询语句和前面所讲的也很相似。如我们希望查询某一个调查主题下的所示调查项,则可以编写以下的查询语句:
SELECT p FROM PollOption p JOIN p.pollTopic t WHERE t.topicId = :topicId
对应的SQL语句为:
SELECT t0.OPTION_ID, t0.OPTION_ITEM, t0.TOPIC_ID FROM T_POLL_OPTION t0,
T_TOPIC t1 WHERE ((t1.TOPIC_ID = ?) AND ((t1.TOPIC_ID = t0.TOPIC_ID)
AND (t1.TOPIC_TYPE = ?)))
使用其它的关系操作符
使用空值比较符,比如查询附件不空的所有帖子对象:
SELECT p FROM Post p WHERE p.postAttach IS NOT NULL
范围比较符包括BETWEEN..AND和>、>= 、<、<=、<>这些操作符。比如下面的语句查询浏览次数在100到200之间的所有论坛主题:
SELECT t FROM Topic t WHERE t.topicViews BETWEEN 100 AND 200
集合关系操作符
和其它实体是One-to-Many或Many-to-Many关系的实体,通过集合引用关联的实体,我们可以通过集合关系操作符进行数据查询。下面的语句返回所有没有选项的调查论坛的主题:
SELECT t FROM PollTopic t WHERE t.options IS EMPTY
我们还可以通过判断元素是否在集合中进行查询:
SELECT t FROM PollTopic t WHERE :option MEMBER OF t.options
这里参数必须绑定一个PollOption的对象,JPA会自动将其转换为主键比较的SQL语句。
子查询
JPA可以进行子查询,并支持几个常见的子查询函数:EXISTS、ALL、ANY。如下面的语句查询出拥有6个以上选项的调查主题:
SELECT t FROM PollTopic t WHERE (SELECT COUNT(o) FROM t.options o) > 6
可用函数
JPA查询支持一些常见的函数,其中可用的字符串操作函数有:
CONCAT(String, String):合并字段串;
LENGTH(String):求字段串的长度;
LOCATE(String, String [,
start]):查询字段串的函数,第一个参数为需要查询的字段串,看它在出现在第二个参数字符串的哪个位置,start表示从哪个位置开始查找,返回查
找到的位置,没有找到返回0。如LOCATE ('b1','a1b1c1',1)返回为3;
SUBSTRING(String, start, length):子字段串函数;
TRIM([[LEADING|TRAILING|BOTH] char) FROM] (String):将字段串前后的特殊字符去除,可以通过选择决定具体的去除位置和字符;
LOWER(String):将字符串转为小写;
UPPER(String):将字符串转为大写。
数字操作函数有:
ABS(number):求绝对值函数;
MOD(int, int):求模的函数;
SQRT(double):求平方函数;
SIZE(Collection):求集合大小函数。
更改语句
可以用EntityManager进行实体的更新操作,也可以通过查询语言执行数据表的字段更新,记录删除的操作:
下面的语句将某一个调查选项更新为新的值:
UPDATE PollOption p SET p.optionItem = :value WHERE p.optionId = :optionId
我们使用Query接口的executeUpdate()方法执行更新。下面的语句删除一条记录:
DELETE FROM PollOption p WHERE p.optionId = :optionId
排序和分组
我们还可以对查询进行排序和分组。如下面的语句查询出主题的发表时间大于某个时间值,返回的结果按浏览量降序排列:
SELECT t FROM Topic t WHERE t.topicTime > :time ORDER BY t.topicViews DESC
下面的语句计算出每个调查主题对应的选项数目:
SELECT COUNT(p),p.pollTopic.topicId FROM PollOption p GROUP BY p.pollTopic.topicId
这里,我们使用了计算数量的聚集函数COUNT(),其它几个可用的聚集函数分别为:
AVG:计算平均值,返回类型为double;
MAX:计算最大值;
MIN:计算最小值;
SUM:计算累加和;
我们还可以通过HAVING对聚集结果进行条件过滤:
SELECT COUNT(p),p.pollTopic.topicId FROM PollOption p GROUP BY p.pollTopic.topicId HAVING p.pollTopic.topicId IN(1,2,3)
分享到:
相关推荐
jpa查询详解 JPA(Java Persistence API)是一种 Java 持久层 API,用于处理 Java 对象和关系数据库之间的 Mapping。JPA 查询是 JPA 中的一种重要机制,用于从数据库中检索数据。在本文中,我们将详细介绍 JPA 查询...
标题“一个基于原生Java代码查询方式的JPA查询框架.zip”指的是一个使用Java Persistence API(JPA)的查询框架,该框架允许开发者使用原生的Java代码进行数据库查询,而不是依赖于HQL(Hibernate Query Language)...
**JPA查询语言详解** Java Persistence API(JPA)是一种标准的Java库,用于管理和持久化Java对象到关系数据库。JPA提供了强大的查询语言——Java Persistence Query Language(JPQL),它允许开发者通过面向对象的...
Jpa详细查询实例介绍,教你如何使用JPA,简单,分类实例。
本项目为基于Java平台的JPA查询封装设计源码,包含70个文件,主要由68个Java源文件、1个XML配置文件以及1个YAML配置文件组成,旨在提供高效的JPA查询封装方案。
springboot官网基础知识——JPA 查询方法
**JPA查询语言(JPQL)**是Java Persistence API中的一个核心特性,它提供了一种面向对象的查询语言,用于在Java应用程序中检索和操作持久化实体。JPQL类似于SQL,但设计的目标是与对象模型更紧密地集成,而不是直接...
JPA复杂查询加分页查询的快速开发 JPA(Java Persistence API)是 Java 的持久层 API,用于访问、持久化数据。使用 JPA,可以快速开发复杂查询,实现高效的数据访问。下面是 JPA 复杂查询加分页查询的快速开发知识...
jpa-spec 在Spring Data JPA之上做扩展,支持原生JPA2规范,极大的简化动态查询语法。特性兼容JPA2规范Equal/NotEqual/Like/In 支持多个参数, Equal/NotEqual 支持Null 值.构建器风格创建查询条件支持分页与构建器...
在本文中,我们将深入探讨Spring Data JPA中的JpaRepository查询功能。Spring Data JPA是Spring框架的一个模块,它简化了与Java Persistence API (JPA)的交互,提供了强大的数据访问抽象,使得数据库操作变得更加...
通过定义自关联的实体类、配置JPA仓库以及编写适当的查询方法,可以轻松地实现对树形数据的CRUD操作。在实际应用中,还需考虑性能优化,如分页加载、懒加载等策略,以避免大量数据导致的效率问题。
7. **Specifications**:对于复杂的查询,Spring Data JPA提供了Specifications接口,允许动态构建查询条件。这在处理复杂的查询逻辑时非常有用。 8. **Pagination and Sorting**:Spring Data JPA支持分页和排序...
JPA 提供了一种面向对象的方式来查询数据,使得开发者无需直接编写SQL,而是使用更直观、面向对象的查询语言,这被称为JPQL(Java Persistence Query Language)。在JPA中,查询语言的语法设计是为了与对象模型紧密...
9. **JPA Querydsl Support**:Spring Data JPA 还支持 Querydsl,这是一个强大的类型安全的查询语言,它可以进一步提高查询的可读性和可维护性。 10. **Elasticsearch 集成**:虽然不是 Spring Data JPA 的核心...
在这个场景中,我们将探讨如何使用JPA进行分页查询以及带有条件的分页查询。 首先,为了使用Spring Data JPA,我们需要在项目中引入相应的依赖。在Maven的pom.xml文件中,你需要添加`spring-boot-starter-data-jpa`...
通过将公共通用操作写进父类简化代码,提高代码的复用。 面向接口 使用继承 泛型 引入JPA API查询 以及 元数据 提高代码的安全性.
#Plugback JPA - 使用 Xtend 的类型安全 JPA 查询 Plugback JPA 是一个模块,允许您扩展 Java Persistence API 以使用类似 sql 的简洁和类型安全的语法查询您的数据库。 === ##你需要什么要使用Plugback JPA,你需要...
本节我们将深入探讨"李勇JPA快速入门05_jpa中的查询"这一主题,这涵盖了JPA查询机制的基础和核心概念。 1. **基本查询语言:JPQL** Java Persistence Query Language(JPQL)是JPA提供的面向对象的查询语言,类似...
JPA详解通常是对JPA的深入解析,包括实体(Entity)、持久化上下文(Persistence Context)、托管状态(Managed State)、懒加载(Lazy Loading)、级联操作(Cascading)、关系映射(Relationship Mapping)、查询...
**JPA查询语言(JPQL)** JPA提供了自己的查询语言——Java Persistence Query Language(JPQL),类似于SQL,但更面向对象。例如,以下JPQL查询返回所有用户: ```java String query = "SELECT u FROM User u"; ...