Spring JPA find单表查询方法示例详解
作者:烟雨戏江南 发布时间:2022-11-03 19:43:38
一、findById(ID id)
通过id进行单条查询,先看看 findById(ID id) 的源码
@Override
public Optional<T> findById(ID id) {
Assert.notNull(id, ID_MUST_NOT_BE_NULL);
Class<T> domainType = getDomainClass();
if (metadata == null) {
return Optional.ofNullable(em.find(domainType, id));
}
LockModeType type = metadata.getLockModeType();
Map<String, Object> hints = new HashMap<>();
getQueryHints().withFetchGraphs(em).forEach(hints::put);
return Optional.ofNullable(type == null ? em.find(domainType, id, hints) : em.find(domainType, id, type, hints));
}
从源码可以看出,最终调用的是EntityManager的find方法,EntityManager是jpa用来做持久化的,有空可以跟大家探讨一下!
下面是控制台的输出:
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.name as name3_0_0_ from user user0_ where user0_.id=?
二、findAll()
查找所有的数据,源码如下:
@Override
public List<T> findAll() {
return getQuery(null, Sort.unsorted()).getResultList();
}
从源码可以看出,最终调用了org.hibernate.Query
的getResultList方法。
控制台输出如下:
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_
三、findAllById(Iterable<ID> ids)
通过ids进行多条查询,源码如下:
@Override
public List<T> findAllById(Iterable<ID> ids) {
Assert.notNull(ids, "Ids must not be null!");
if (!ids.iterator().hasNext()) {
return Collections.emptyList();
}
if (entityInformation.hasCompositeId()) {
List<T> results = new ArrayList<>();
for (ID id : ids) {
findById(id).ifPresent(results::add);
}
return results;
}
Collection<ID> idCollection = Streamable.of(ids).toList();
ByIdsSpecification<T> specification = new ByIdsSpecification<>(entityInformation);
TypedQuery<T> query = getQuery(specification, Sort.unsorted());
return query.setParameter(specification.parameter, idCollection).getResultList();
}
从源码可以看出,跟findAll方法一样,最终调用的是org.hibernate.Query
的getResultList方法,只不过加了id的集合。
控制台打印如下:
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.id in (? , ?)
control层
@GetMapping("findAllById")
public List<User> findAllById(Integer[] ids) {
return userService.findAllById(Arrays.asList(ids));
}
四、findAll(Sort sort) 单调排序
根据sort对象对所有数据进行相应的排序
@Override
public List<T> findAll(Sort sort) {
return getQuery(null, sort).getResultList();
}
这个源码也是没啥可看的!需要注意的就是这个sort对象。
这个sort对象是需要我们自己去创建,然后根据自己的诉求传入相应的参数。这里我们就是使用sort.by来实现吧(也可以通过其他方法)
sort.by 源码
/**
* Creates a new {@link Sort} for the given {@link Order}s.
*
* @param direction must not be {@literal null}.
* @param properties must not be {@literal null}.
* @return
*/
public static Sort by(Direction direction, String... properties) {
Assert.notNull(direction, "Direction must not be null");
Assert.notNull(properties, "Properties must not be null");
Assert.isTrue(properties.length > 0, "At least one property must be given");
return Sort.by(Arrays.stream(properties)//
.map(it -> new Order(direction, it))//
.collect(Collectors.toList()));
}
可以看到我们需要传入两个参数,分别是 direction 和 properties:
direction 是排序方向(升序或降序)
properties 是排序的对象,是个数组(可以是单个也可以是多个)
control层
@GetMapping("findAllSort")
public List<User> findAllSort(String ascOrDesc, String[] para) {
Sort sort;
if(ascOrDesc.toLowerCase().equals("desc")){
sort = Sort.by( Sort.Direction.DESC, para);
}else {
sort = Sort.by( Sort.Direction.ASC, para);
}
return userService.findAllSort(sort);
}
请求 findAllSort?ascOrDesc=desc¶=age,name
,对 age 和 name 进行降序排序,结果如下:
[{
"id": 21,
"name": "bb",
"age": 12
}, {
"id": 22,
"name": "cc",
"age": 11
}, {
"id": 20,
"name": "aa",
"age": 11
}]
控制台输出如下:
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ order by user0_.age desc, user0_.name desc
五、findAll(Sort sort) 多参数排序
上面的只能进行单调的排序,就是说多个对象只能一同升序或者降序;而在实际需求中,有时候还需要对多个对象,进行不同的排序,有的升序,有的降序。想要完成这样的查询,我们还是需要依靠sort对象去实现。sort.by 的入参中还有可以传 order 数组和列表,我们就利用数组和列表对数据进行多参数的多样排序,话不多说,直接上码。
Sort by 源码
/**
* Creates a new {@link Sort} for the given {@link Order}s.
*
* @param orders must not be {@literal null}.
* @return
*/
public static Sort by(List<Order> orders) {
Assert.notNull(orders, "Orders must not be null");
return orders.isEmpty() ? Sort.unsorted() : new Sort(orders);
}
/**
* Creates a new {@link Sort} for the given {@link Order}s.
*
* @param orders must not be {@literal null}.
* @return
*/
public static Sort by(Order... orders) {
Assert.notNull(orders, "Orders must not be null");
return new Sort(Arrays.asList(orders));
}
control 层
@GetMapping("findAllMoreSort")
public List<User> findAllMoreSort(String[] sorts,String[] paras) {
int length = sorts.length;
//Sort.Order[] orders = new Sort.Order[length];
List<Sort.Order> listOrder = new ArrayList<>();
for(int i=0; i<length; i++){
// orders[i] = new Sort.Order(sorts[i].toLowerCase().equals("asc") ?
// Sort.Direction.ASC : Sort.Direction.DESC, paras[i]);
listOrder.add(new Sort.Order(sorts[i].toLowerCase().equals("asc") ?
Sort.Direction.ASC : Sort.Direction.DESC, paras[i]));
}
//Sort sort = Sort.by(orders);
Sort sort = Sort.by(listOrder);
return userService.findAllSort(sort);
}
请求findAllMoreSort?sorts=asc,desc¶s=age,name
,对age升序,对name降序,结果如下:
[{
"id": 22,
"name": "cc",
"age": 11
}, {
"id": 20,
"name": "aa",
"age": 11
}, {
"id": 21,
"name": "bb",
"age": 12
}]
控制台输出如下:
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ order by user0_.age asc, user0_.name desc
来源:https://juejin.cn/post/7223325947339882555


猜你喜欢
- Eclipse安装配置好之后,小千再来带大家进行基本的使用。1. 创建项目我们可以点击左上角的File-->New-->Proj
- 本篇和大家分享的是通过maven对springboot中打war包和jar包;war通常来说生成后直接放到tomcat的webapps下面就
- 常量是固定值,程序执行期间不会改变。常量可以是任何基本数据类型,比如整数常量、浮点常量、字符常量或者字符串常量,还有枚举常量。常量可以被当作
- 一个类,有时候搞不清楚到底用成员变量还是属性。 如: 成员变量 public string
- 各种手机助手里面都包含了短信备份这一项。短信的本分主要包含四项:内容body、事件date、方式type、号码address。短信备份~一。
- 一、总体概述官方文档:https://docs.devexpress.com/WindowsForms/8117/controls-and-
- 前言这是几个月前写的博文,睡前看了觉得有些敷衍,还是改了再发吧。之前的博客做了个锁屏应用,在以前各种酷炫的锁屏效果是很流行的,有时候会去锁屏
- 英文设置加粗可以在xml里面设置: <SPAN style="FONT-SIZE: 18px">androi
- 目录Fanout交换机模型RabbitMQ控制台操作新增两个队列绑定fanout交换机示例效果图核心代码消息发布消息订阅Fanout交换机模
- 一问道StringBuffer与StringBuilder的区别,张口就来StringBuffer是线程安全的,因为它相关方法都加了sync
- 本文实例展示了WinForm实现为TextBox设置水印文字功能,非常实用的技巧,分享给大家供大家参考。关键代码如下:using Syste
- 今天有同事用swagger2开发时,有一方法返回Map<String,List<Object>>出现无法解析错误。P
- 一、先上效果图借用某东App的效果,如下。折叠时的效果:展开时的效果:二、ChipGroup和ChipchipGroup和chip之前写过博
- 方法参数public String listFireEvent(@Valid FireSearch fireSearch, Ht
- 编译篇 研究Chrome ,首先得把它编译出来,这对于后续的代码分析和阅读有很大的帮助,想想自己编译出一个 Chrome 浏览器来使用,那是
- C# windows语音识别与朗读示例,供大家参考,具体内容如下本示例通过windows语音识别功能进行语音识别和文本朗读。打开window
- 这里主要介绍的是优先队列的二叉堆Java实现,代码如下:package practice;import edu.princeton.cs.a
- Eclipse的Servers视图中无法添加Tomcat6/Tomcat7的方法引言: 在基于Eclipse的开发过程中,出现了无法在Ecl
- 今天给大家讲讲有关自定义对话框的相关内容,前面两篇都在在利用系统提供的函数来实现对话框,但局限性太大,当我们想自己定义视图的时候,就不能利用
- 波浪球的效果一直都是想模仿的对象,在最近一段时间里模仿了这一界面,其实所用知识并不多。1)、波浪的效果是利用三角函数来实现的,在自定义vie