日韩性视频-久久久蜜桃-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集合进行排序的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产xxxxx视频 | 性的免费视频 | 国产88av | 女同毛片一区二区三区 | 国产欧美在线精品日韩 | 超碰蜜臀 | 老女人乱淫 | 亚洲小说区图片区都市 | 伊人春色网 | 色一区二区三区四区 | 成人免费视频国产免费麻豆 | 日本在线观看 | av网站大全在线 | 国产成人精品视频在线观看 | 国产原创91| 黄页av| 能看的av | 人妻换人妻a片爽麻豆 | 可以免费看av的网址 | 亚洲一区欧美二区 | 一级片免费网址 | 中文字幕 视频一区 | 亚洲国产精品成人午夜在线观看 | 免费精品视频 | 国产精品黑丝 | 日日撸视频 | 大胸奶汁乳流奶水出来h | 亚洲视频在线免费播放 | 3d动漫精品啪啪一区二区下载 | 粉嫩久久99精品久久久久久夜 | 精品国产网站 | 亚洲激情综合 | 日韩欧美中文在线观看 | 美女激情网站 | 国产精品美女久久 | 天天射综合 | 成年人免费视频播放 | 91免费看片网站 | 亚洲激情网站 | 99一区二区三区 | 亚洲激情啪啪 | aav在线| 久久成人黄色 | 免费啪| 亚洲国产综合视频 | 黄色免费看视频 | 欧美 日韩 精品 | 99在线成人精品视频 | 国产欧美日韩在线观看 | 动漫女被黄漫免费视频 | 黄色片在线免费看 | 日本亚洲精品 | 伊人网视频 | 香蕉久久精品日日躁夜夜躁 | 999zyz玖玖资源站永久 | 九九热视频免费观看 | 日韩欧美黄色网址 | 成人宗合 | 国产av一区二区三区传媒 | 久久视频这里只有精品 | 中文字幕乱码亚洲无线三区 | 麻豆出品 | 精品一区二区亚洲 | 五月天婷婷基地 | 韩国欧美三级 | 中国黄色片子 | 日本免费色视频 | 国产乱来视频 | 你操综合 | 亚洲高清欧美 | 久久影音| 久久国产美女 | 国色天香网站 | 黄网站免费在线观看 | 亚洲av人无码激艳猛片服务器 | 精品一区二区三区免费毛片 | 97超碰在线资源 | 女人性做爰24姿势视频 | 精品国产乱码久久久久久88av | 美女屁股网站 | 黑帮大佬和我的三百六十五天 | 亚洲av无码一区二区二三区软件 | 免费在线国产精品 | 淫辱的世界(调教sm)by | 亚洲激情a | 亚洲欧美另类在线视频 | 国产ts在线 | 射一射| 久久精品首页 | 国产在线观看黄色 | 五月婷婷婷婷 | 少妇高潮一区二区三区99小说 | 免费在线观看黄色网址 | av大片在线免费观看 | 91麻豆视频在线观看 | 韩国三级中文字幕hd久久精品 | 亚洲熟伦熟女新五十路熟妇 | 成人传媒| 老司机黄色影院 |