日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

使用@OrderBy对Spring Data MongoDB集合进行排序

發布時間:2023/12/3 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用@OrderBy对Spring Data MongoDB集合进行排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這是關于調整和增強Spring Data MongoDB功能的第三篇文章。 這次,我發現我錯過了一個JPA功能– @OrderBy批注。 @OrderBy指定在檢索關聯值時集合值關聯的元素的順序。

在本文中,我將展示如何使用Spring Data MongoDB使用@OrderBy批注實現排序?

用例

對于那些以前沒有使用過JPA @OrderBy的人來說,這只是一個簡短的例子。 我們這里有兩個類和一對多關系:

package pl.maciejwalkowiak.springdata.mongodb.domain;import org.bson.types.ObjectId; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document;@Document public class Backpack {@Idprivate ObjectId id;private List<Item> items;... }public class Item {private String name;private int price;... }

背包在這里是主要類別,其中包含嵌入式物品清單。 從數據庫中加載背包時,其項目將按接近插入順序的順序加載。 如果我們想更改它并按其字段之一訂購商品怎么辦? 我們需要自己實現排序,然后再次擴展AbstractMongoEventListener 。

排序詳細信息:介紹@OrderBy

與JPA相反,在這種情況下,排序不能在數據庫級別進行。 我們需要在應用程序端注意這一點–可以在兩個地方完成:

  • 在將對象轉換成MongoDB數據結構之前–如果我們要確保在MongoDB集合中正確對對象進行排序
  • 將對象從MongoDB數據結構轉換為Java對象之后–如果我們只想確保應用程序內部的List正確排序

為了指定應該在哪個位置進行排序,我創建了SortPhase枚舉:

public enum SortPhase {AFTER_CONVERT,BEFORE_CONVERT; }

最后– @OrderBy批注將包含三個幾乎自我描述的屬性:

package pl.maciejwalkowiak.springdata.mongodb;import org.springframework.data.mongodb.core.query.Order;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.FIELD }) public @interface OrderBy {/*** Field name*/String value();Order order() default Order.ASCENDING;SortPhase[] phase() default SortPhase.AFTER_CONVERT; }

實現SortingMongoEventListener

聲明式排序必須使用反射。 為了保持代碼可讀性,我使用了commons-beanutils,但可以不使用它而手動完成。 在項目中添加以下依賴項:

<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.8.3</version> </dependency><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.1</version> </dependency>

最后一部分是SortingMongoEventListener實現:

package pl.maciejwalkowiak.springdata.mongodb;import com.mongodb.DBObject; import org.apache.commons.beanutils.BeanComparator; import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener; import org.springframework.data.mongodb.core.query.Order; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils;import java.lang.reflect.Field; import java.util.Arrays; import java.util.Collections; import java.util.List;/*** MongoEventListener that intercepts object before its converted to BasicDBObject (before it is saved into MongoDB)* and after its loaded from MongoDB.** @author Maciej Walkowiak*/ public class SortingMongoEventListener extends AbstractMongoEventListener {@Overridepublic void onAfterConvert(DBObject dbo, final Object source) {ReflectionUtils.doWithFields(source.getClass(), new SortingFieldCallback(source, SortPhase.AFTER_CONVERT));}@Overridepublic void onBeforeConvert(Object source) {ReflectionUtils.doWithFields(source.getClass(), new SortingFieldCallback(source, SortPhase.BEFORE_CONVERT));}/*** Performs sorting with field if:* <ul>* <li>field is an instance of list</li>* <li>is annotated with OrderBy annotation</li>* <li>OrderBy annotation is set to run in same phase as SortingFieldCallback</li>* </ul>*/private static class SortingFieldCallback implements ReflectionUtils.FieldCallback {private Object source;private SortPhase phase;private SortingFieldCallback(Object source, SortPhase phase) {this.source = source;this.phase = phase;}public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {if (field.isAnnotationPresent(OrderBy.class)) {OrderBy orderBy = field.getAnnotation(OrderBy.class);if (Arrays.asList(orderBy.phase()).contains(phase)) {ReflectionUtils.makeAccessible(field);Object fieldValue = field.get(source);sort(fieldValue, orderBy);}}}private void sort(Object fieldValue, OrderBy orderBy) {if (ClassUtils.isAssignable(List.class, fieldValue.getClass())) {final List list = (List) fieldValue;if (orderBy.order() == Order.ASCENDING) {Collections.sort(list, new BeanComparator(orderBy.value()));} else {Collections.sort(list, new BeanComparator(orderBy.value(), Collections.reverseOrder()));}}}} }

為了使用它,您只需要在應用程序上下文中將該類聲明為Spring Bean:

<bean class="pl.maciejwalkowiak.springdata.mongodb.SortingMongoEventListener" />

現在是從這篇文章的開頭將創建的OrderBy注釋添加到Backpack類的時候了。 假設我們要按價格降序訂購商品:

@Document public class Backpack {@Idprivate ObjectId id;@OrderBy(value = "price", order = Order.DESCENDING)private List<Item> items;... }

而已。 現在,每次加載背包對象時(無論它的findAll,findOne還是您的自定義方法都沒有關系),背包中的物品將被訂購。 ?

摘要

SortingMongoEventListener是Spring Data MongoDB事件系統功能強大的另一個示例。 歡迎您發表評論,如果您認為此功能可能是Spring Data MongoDB的一部分,請告訴我。

參考: Software Development Journey博客上的JCG合作伙伴 Maciej Walkowiak 使用@OrderBy對Spring Data MongoDB集合進行排序 。


翻譯自: https://www.javacodegeeks.com/2012/07/sorting-spring-data-mongodb-collections.html

總結

以上是生活随笔為你收集整理的使用@OrderBy对Spring Data MongoDB集合进行排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲欧美一区二区三 | 日韩不卡毛片 | 欧美精品一级片 | 巨乳女教师的诱惑 | 日本黄色免费大片 | 国产精品高潮AV无码 | 国产成人一区二区三区影院在线 | 国产精品久久久久久久久久久久午夜片 | 69sex久久精品国产麻豆 | 伊人啪啪| 激情综合区 | 中文字幕永久在线视频 | 日本免费在线观看 | 日韩一区二区三区三四区视频在线观看 | 丝袜美腿av | 成人一区在线观看 | 亚洲一线在线观看 | 国产精品久久久久久一区二区三区 | 偷拍第1页 | 欧美操穴 | 午夜精品久久久久久久四虎美女版 | 日韩电影精品 | 成人免费xxxxx在线视频 | 久久久久久久一 | 国产第56页 | 久久久久久久久久久久国产精品 | 欧美黄色片视频 | 久久久96| 轻轻色在线观看 | 都市激情麻豆 | 激情吧 | 艳妇臀荡乳欲伦交换在线看 | 国产99久久久久久免费看 | 久久精品第一页 | 9色视频 | 午夜视| 极品少妇在线 | 久久久精品国产sm调教网站 | 色综合免费视频 | 一级特黄aa大片 | www.久久久久久久久久 | jizz在线观看 | 久久免费一级片 | 亚洲拍拍视频 | 人妻换人妻仑乱 | 成品短视频泡芙 | 男女涩涩视频 | 午夜伦伦电影理论片费看 | 精品亚洲中文字幕 | 草一色| 国产精品夜夜嗨 | 色婷婷在线观看视频 | 亚洲大片免费 | 蜜桃色999| 韩日一区二区三区 | 一本色道久久加勒比精品 | 一级全黄毛片 | 高跟av| www.avcao | 电影91久久久 | 高清国产一区二区三区 | 探花视频在线版播放免费观看 | 天天干天天插天天射 | 国产精品99久久久久久动医院 | 天堂999 | 性久久久久久久久 | 韩国黄色av | 久久精品视频日本 | 色悠悠国产 | av在线影音 | av一区二区在线播放 | 日本欧美国产一区二区三区 | 少妇床戏av | 国产精品无码99re | 国产成人在线免费观看视频 | 青青视频免费 | 天堂在线资源8 | 亚洲精品视频免费 | 久久国产秒 | 涩涩视频在线播放 | 中文字幕在线有码 | 国产性生活一级片 | 亚洲日本精品视频 | 中文字幕人妻精品一区 | 色婷婷五 | 日韩综合一区二区三区 | 日韩网红少妇无码视频香港 | 中文字幕有码在线播放 | 亚洲精品97 | 国产日韩欧美自拍 | 国产成人av片| 人人亚洲 | 上床视频在线观看 | 超碰免费成人 | 国产精品伊人久久 | 五月婷婷基地 | 丰满女人又爽又紧又丰满 | 亚洲男人av | 好姑娘在线观看高清完整版电影 |