Spring JPA find單表查詢方法示例詳解
一、findById(ID id)
通過id進(jìn)行單條查詢,先看看 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));
}從源碼可以看出,最終調(diào)用的是EntityManager的find方法,EntityManager是jpa用來做持久化的,有空可以跟大家探討一下!
下面是控制臺(tái)的輸出:
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()
查找所有的數(shù)據(jù),源碼如下:
@Override
public List<T> findAll() {
return getQuery(null, Sort.unsorted()).getResultList();
}從源碼可以看出,最終調(diào)用了org.hibernate.Query的getResultList方法。
控制臺(tái)輸出如下:
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進(jìn)行多條查詢,源碼如下:
@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方法一樣,最終調(diào)用的是org.hibernate.Query的getResultList方法,只不過加了id的集合。
控制臺(tái)打印如下:
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) 單調(diào)排序
根據(jù)sort對(duì)象對(duì)所有數(shù)據(jù)進(jìn)行相應(yīng)的排序
@Override
public List<T> findAll(Sort sort) {
return getQuery(null, sort).getResultList();
}這個(gè)源碼也是沒啥可看的!需要注意的就是這個(gè)sort對(duì)象。
這個(gè)sort對(duì)象是需要我們自己去創(chuàng)建,然后根據(jù)自己的訴求傳入相應(yīng)的參數(shù)。這里我們就是使用sort.by來實(shí)現(xiàn)吧(也可以通過其他方法)
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()));
}可以看到我們需要傳入兩個(gè)參數(shù),分別是 direction 和 properties:
direction 是排序方向(升序或降序)
properties 是排序的對(duì)象,是個(gè)數(shù)組(可以是單個(gè)也可以是多個(gè))
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);
}請(qǐng)求 findAllSort?ascOrDesc=desc¶=age,name,對(duì) age 和 name 進(jìn)行降序排序,結(jié)果如下:
[{
"id": 21,
"name": "bb",
"age": 12
}, {
"id": 22,
"name": "cc",
"age": 11
}, {
"id": 20,
"name": "aa",
"age": 11
}]控制臺(tái)輸出如下:
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) 多參數(shù)排序
上面的只能進(jìn)行單調(diào)的排序,就是說多個(gè)對(duì)象只能一同升序或者降序;而在實(shí)際需求中,有時(shí)候還需要對(duì)多個(gè)對(duì)象,進(jìn)行不同的排序,有的升序,有的降序。想要完成這樣的查詢,我們還是需要依靠sort對(duì)象去實(shí)現(xiàn)。sort.by 的入?yún)⒅羞€有可以傳 order 數(shù)組和列表,我們就利用數(shù)組和列表對(duì)數(shù)據(jù)進(jìn)行多參數(shù)的多樣排序,話不多說,直接上碼。
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);
}請(qǐng)求findAllMoreSort?sorts=asc,desc¶s=age,name,對(duì)age升序,對(duì)name降序,結(jié)果如下:
[{
"id": 22,
"name": "cc",
"age": 11
}, {
"id": 20,
"name": "aa",
"age": 11
}, {
"id": 21,
"name": "bb",
"age": 12
}]控制臺(tái)輸出如下:
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
總結(jié)
find 相當(dāng)于增刪改查中的查,也是其中最復(fù)雜的一個(gè)操作,因?yàn)樯婕暗臇|西比較多。這篇主要是整理了單表的單條查詢和多條查詢,下一篇準(zhǔn)備看看單表的分頁查詢。
以上就是Spring JPA find單表查詢方法示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring JPA find單表查詢的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot應(yīng)用jar包啟動(dòng)原理詳解
本文主要介紹了SpringBoot應(yīng)用jar包啟動(dòng)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03
mybatis如何實(shí)現(xiàn)in傳入數(shù)組查詢
這篇文章主要介紹了mybatis如何實(shí)現(xiàn)in傳入數(shù)組查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java異常處理 Throwable實(shí)現(xiàn)方法解析
這篇文章主要介紹了Java異常處理 Throwable實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
maven打包本地jar到項(xiàng)目中的方法實(shí)現(xiàn)
本文主要介紹了maven打包本地jar到項(xiàng)目中的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Java 為什么要避免使用finalizer和Cleaner
這篇文章主要介紹了Java 為什么要避免使用finalizer和Cleaner,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03
淺談java多態(tài)的實(shí)現(xiàn)主要體現(xiàn)在哪些方面
下面小編就為大家?guī)硪黄獪\談java多態(tài)的實(shí)現(xiàn)主要體現(xiàn)在哪些方面。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09

