Spring JPA find单表查询方法示例详解

 更新时间:2023年04月26日 15:51:56   作者:烟雨戏江南  
这篇文章主要为大家介绍了Spring JPA find单表查询方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、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()));
}

可以看到我们需要传入两个参数,分别是 directionproperties

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&para=age,name,对 agename 进行降序排序,结果如下:

[{
	"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&paras=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

总结

find 相当于增删改查中的查,也是其中最复杂的一个操作,因为涉及的东西比较多。这篇主要是整理了单表的单条查询和多条查询,下一篇准备看看单表的分页查询。

以上就是Spring JPA find单表查询方法示例详解的详细内容,更多关于Spring JPA find单表查询的资料请关注脚本之家其它相关文章!

相关文章

  • Nacos注册中心的部署与用法示例详解

    Nacos注册中心的部署与用法示例详解

    注册中心是微服务架构中的纽带,类似于“通讯录”,它记录了服务和服务地址的映射关系,本文通过示例代码给大家介绍Nacos注册中心的部署与用法,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • Spring3 MVC请求参数获取的几种方法小结

    Spring3 MVC请求参数获取的几种方法小结

    本篇文章主要介绍了Spring3 MVC请求参数获取的几种方法小结,非常具有实用价值,需要的朋友可以参考下。
    2017-03-03
  • ArrayList和LinkedList的区别、扩容机制以及底层的实现方式

    ArrayList和LinkedList的区别、扩容机制以及底层的实现方式

    这篇文章主要介绍了ArrayList和LinkedList的区别、扩容机制以及底层的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • java调用微信现金红包接口的心得与体会总结

    java调用微信现金红包接口的心得与体会总结

    这篇文章主要介绍了java调用微信现金红包接口的心得与体会总结,有需要的朋友可以了解一下。
    2016-11-11
  • 基于springboot的RestTemplate、okhttp和HttpClient对比分析

    基于springboot的RestTemplate、okhttp和HttpClient对比分析

    这篇文章主要介绍了基于springboot的RestTemplate、okhttp和HttpClient对比分析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Spring中的父子容器原理解析

    Spring中的父子容器原理解析

    这篇文章主要为大家介绍了Spring中的父子容器原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 深入理解Java设计模式之访问者模式

    深入理解Java设计模式之访问者模式

    这篇文章主要介绍了JAVA设计模式之访问者模式的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解
    2021-11-11
  • java JSONArray 遍历方式(2种)

    java JSONArray 遍历方式(2种)

    这篇文章主要介绍了java JSONArray 遍历方式(2种),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • SpringBoot使用前缀树实现敏感词过滤示例

    SpringBoot使用前缀树实现敏感词过滤示例

    最近项目用到了敏感词过滤,本文主要就来介绍一下SpringBoot使用前缀树实现敏感词过滤示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • Java实现贪吃蛇游戏(1小时学会)

    Java实现贪吃蛇游戏(1小时学会)

    这篇文章主要为大家详细介绍了Java实现贪吃蛇游戏,1小时学会贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05

最新评论