当前位置: 首页 > 后端技术 > Java

Spring认证中国教育管理中心-SpringDataCouchbase教程五

时间:2023-04-01 17:17:17 Java

原标题:Spring认证中国教育管理中心-SpringDataCouchbase教程五(Spring中国教育管理中心)SpringDataCouchbase教程五4.4.5限制查询结果即可使用firstortop关键字来限制查询方法的结果,可以交替使用。您可以将可选数值附加到top或first以指定要返回的最大结果大小。如果省略此数字,则假定结果大小为1。以下示例显示如何限制查询大小:示例39.使用Topand限制查询的结果大小FirstUserfindFirstByOrderByLastnameAsc();UserfindTopByOrderByAgeDesc();PagequeryFirst10ByLastname(Stringlastname,Pageablepageable);SlicefindTop3ByLastname(Stringlastname,Pageablepageable);ListfindFirst10ByLastname(Stringlastname,Sortsort);ListfindTop10ByLastname(Stringlastname,Pageablepageable);限制表达式还支持Distinct关键字用于支持不同查询的数据存储。此外,对于将结果集限制为一个实例的查询,Optional支持使用关键字将结果包装到其中。如果应该使用分页或切片来限制查询分页(以及可用页数的计算),则在限制结果中应用。通过Sort参数限制结果结合动态排序,可以表达“K”个最小元素和“K”个最大元素的查询方式。4.4.6返回集合或迭代的存储库方法返回多个结果的查询方法可以使用标准的JavaIterable、List和Set。此外,我们还支持返回SpringData的Streamable自定义扩展Iterable,以及Vavr提供的集合类型。请参阅解释所有可能的查询方法返回类型的附录。使用Streamable作为查询方法的返回类型您可以使用Streamable作为Iterable或任何集合类型的替代品。它提供了方便的方法来访问非并行流(缺少Iterables)以及直接....filter(...)和....map(...)覆盖元素并将Streamables连接到其他元素的能力:示例40.将查询与Streamables方法结果接口PersonRepositoryextendsRepository{StreamablefindByFirstnameContaining(Stringfirstname);StreamablefindByLastnameContaining(Stringlastname);}Streamable结果=repository.findByFirstnameContaining("av").and(repository.findByLastnameContaining("ea"));返回自定义StreamableWrapper类型为集合提供专用包装器类型是为返回多个元素的查询结果提供API的常见模式。通常,通过调用返回类集合类型的存储库方法并手动创建包装器类型的实例来使用这些类型。您可以避免该额外步骤,因为SpringData允许您使用这些包装器类型作为查询方法返回类型,前提是它们满足以下条件:该类型实现Streamable。该类型公开构造函数或命名的静态工厂方法of(...)或valueOf(...)应该将Streamable作为参数。以下清单显示了一个示例:publicMonetaryAmountgetTotal(){returnstreamable.stream().map(Priced::getPrice).reduce(Money.of(0),MonetaryAmount::add);}@OverridepublicIteratoriterator(){returnstreamable.iterator();}}interfaceProductRepositoryimplementsRepository{ProductsfindAllByDescriptionContaining(Stringtext);Product公开的API,用于访问产品的价格实体。可以使用Products.of(…)(使用Lombok注释创建的工厂方法)构造的Streamable包装器类型。采用Streamable的标准构造函数也可以。包装器类型公开用于计算Streamable的附加API。实现Streamable接口并委托给实际结果。包装器类型Products可以直接用作查询方法的返回类型。您不需要在存储库客户端中查询后返回Streamable并手动包装它。SpringDataCouchbase教程5支持Vavr集合Vavr是一个包含Java函数式编程概念的库。它自带了一组自定义的集合类型,你可以使用它们作为查询方法的返回类型,如下表所示:SpringDataCouchbase教程五你可以使用第一列中的类型(或其子类型)作为查询方法的返回类型,根据实际查询结果的Java类型(第三列)得到第二列中作为实现类型使用的类型。或者,您可以声明Traversable(相当于VavrIterable),然后我们根据实际返回值派生实现类。即ajava.util.List变为VavrList或Seq,ajava.util.Set变为VavrLinkedHashSetSet,等等。4.4.7.存储库方法的空处理从SpringData2.0开始,返回单个聚合实例的存储库CRUD方法使用Java8Optional来指示可能的缺失值。除此之外,SpringData支持在查询方法上返回以下包装器类型:com.google.common.base.Optionalscala.Optionio.vavr.control.Option或者,查询方法可以选择根本不使用包装器类型。然后通过返回null来指示缺少查询结果。返回集合、集合覆盖、包装器和流的存储库方法保证永远不会返回null,而是返回相应的空表示。有关详细信息,请参阅“存储库查询返回类型”。可空性注释您可以使用SpringFramework的可空性注释来表达对存储库方法的可空性约束。它们提供了一种工具友好的方法,并在运行时选择加入对null的检查,如下所示:@NonNullApi:在包级别用于声明参数和返回值的默认行为是既不接受也不产生null值,分别。@NonNull:用于不能使用的参数或返回值null(@NonNullApi适用的参数和返回值不需要)。@Nullable:用于参数或返回值时可以为null。Spring注释使用JSR305注释(一种休眠但广泛使用的JSR)进行元注释。JSR305元注释让工具供应商(例如IDEA、Eclipse和Kotlin)以通用方式提供空安全支持,而无需对Spring注释进行硬编码支持。要为查询方法启用可空性约束的运行时检查,您需要使用Spring的@NonNullApiin、package-info.java在包级别激活不可空性,如以下示例所示:示例41.声明不可空的包信息。java@org.springframework.lang.NonNullApipackagecom.acme;一旦设置了非空默认值,存储库查询方法调用将在运行时验证可空性约束。如果查询结果违反定义的约束,则抛出异常。当一个方法将返回null但被声明为不可为null(默认情况下在存储库所在的包上定义的注释)时,就会发生这种情况。如果要再次选择可为null的结果,可选择在各个方法上使用@Nullable。使用本节开头提到的结果包装器类型继续按预期工作:空结果被转换为表示不存在的值。以下示例展示了刚刚描述的一些技术:示例42.使用不同的可空性约束包com.acme;导入org.springframework.lang.Nullable;interfaceUserRepositoryextendsRepository{UsergetByEmailAddress(EmailAddressemailAddress);@NullableUserfindByEmailAddress(@NullableEmailAddressemailAdress);可选<用户>findOptionalByEmailAddress(EmailAddressemailAddress);存储库位于我们为其定义非空行为的包(或子包)中。当查询没有产生结果时抛出EmptyResultDataAccessException。当将emailAddress传递给该方法时,IllegalArgumentException会抛出null。当查询没有产生结果时返回null。还接受null作为emailAddress的值。Optional.empty()当查询没有产生结果时返回。当将emailAddress传递给该方法时,IllegalArgumentException会抛出null。SpringDataCouchbase教程5基于Kotlin的存储库中的可空性Kotlin将可空性约束的定义合并到语言中。Kotlin代码编译为字节码,它不是通过方法签名而是通过编译后的元数据来表达可空性约束。确保在您的项目中包含kotlin-reflectJAR以启用对Kotlin可空性约束的自省。SpringData存储库使用语言机制来定义这些约束以应用相同的运行时检查,如下所示:示例43.在Kotlin存储库接口上使用可空性约束UserRepository:Repository{funfindByUsername(username:String):UserfunfindByFirstname(名字:字符串?):用户?此方法将参数和结果都定义为不可为空(Kotlin默认值)。Kotlin编译器拒绝将null传递给方法的方法调用。如果查询产生空结果,则抛出EmptyResultDataAccessException。该方法接受一个nullfirstname参数,如果查询没有产生结果则返回null。4.4.8流式查询结果您可以增量处理使用Java8Stream作为返回类型的查询方法的结果。不要将查询结果包装在Stream中,而是使用特定于数据存储的方法来执行流式传输,如以下示例所示:示例44.使用Java8Stream@Query("selectufromUseru")流式传输查询结果StreamfindAllByCustomQueryAndStream();StreamreadAllByFirstnameNotNull();@Query("selectufromUseru")StreamstreamAllPaged(Pageablepageable);AStream可能会包装底层数据存储特定资源,因此必须在使用后关闭。您可以使用close()方法或使用Java7try-with-resources块手动关闭Stream,如以下示例所示:示例45.处理Stream结果为try-with-resourcestry(Streamstream=repository.findAllByCustomQueryAndStream()){stream.forEach(…);}目前并非所有SpringData模块都支持Stream作为返回类型。4.4.9异步查询结果您可以使用Spring的异步方法运行功能异步运行存储库查询。这意味着该方法在调用时立即返回,而实际查询发生在已提交给Spring的TaskExecutor中。异步查询不同于反应式查询,不应混用。有关响应式支持的更多详细信息,请参阅特定于商店的文档。以下示例显示了许多异步查询:@AsyncFuturefindByFirstname(Stringfirstname);@AsyncCompletableFuturefindOneByFirstname(Stringfirstname);@AsyncListenableFuturefindOneByLastname(Stringlastname);使用java.util.concurrent.Future作为返回类型。使用Java8java.util.concurrent.CompletableFuture作为返回类型。使用aorg.springframework.util.concurrent.ListenableFuture作为返回类型。4.5.创建存储库实例本节介绍如何为定义的存储库接口创建实例和bean定义。一种方法是使用每个支持存储库机制的SpringData模块附带的Spring命名空间,尽管我们通常建议使用Java配置。4.5.1.XML配置每个SpringData模块都包含一个repositories元素,它允许您定义Spring为您扫描的基础包,如以下示例所示:示例46.通过XML启用SpringData存储库在前面的示例中,指示Spring扫描com.acme.repositories的所有子包以查找扩展接口Repository或其子接口之一。对于找到的每个接口,基础结构向FactoryBean注册特定的持久性技术,以创建适当的代理来处理查询方法的调用。每个bean都在从接口名称派生的bean名称下注册,因此接口UserRepository将在userRepository中。嵌套存储库接口的bean名称以它们的封闭类型名称为前缀。base-package属性允许使用通配符,以便您可以定义扫描包的模式。使用过滤器默认情况下,基础架构会选择每个接口,这些接口在配置的基础包下扩展存储库的持久性技术特定的子接口,并为其创建一个bean实例。但是,您可能希望更细粒度地控制哪些接口具有为其创建的bean实例。为此,请在元素内使用元素。语义完全等同于Spring上下文命名空间中的元素。有关详细信息,请参阅这些元素的Spring参考文档。例如,要将某些接口从作为存储库bean的实例化中排除,您可以使用以下配置:示例47.使用exclude-filter元素前面的示例排除了所有以SomeRepository实例化结尾的接口。4.5.2.Java配置您还可以通过@Enable${store}Repositories在Java配置类上使用特定于商店的注释来触发存储库基础结构。有关Spring容器的基于Java的配置的介绍,请参阅Spring参考文档中的JavaConfig。启用SpringData存储库的示例配置如下所示:示例48.基于注解的存储库配置示例@Configuration@EnableJpaRepositories("com.acme.repositories")classApplicationConfiguration{@BeanEntityManagerFactoryentityManagerFactory(){//...}}前面的示例使用特定于JPA的注释,您可以根据您使用的实际存储模块进行更改。这同样适用于EntityManagerFactorybean的定义。请参阅涵盖商店特定配置的部分。4.5.3.独立使用您还可以在Spring容器之外使用存储库基础设施——例如,在CDI环境中。您的类路径中仍然需要一些Spring库,但通常您也可以通过编程方式设置存储库。提供存储库支持的SpringData模块带有一个特定于您可以使用的持久化技术的RepositoryFactory,如下所示:示例49.独立使用存储库工厂RepositoryFactorySupportfactory=...//InstantiatefactoryhereUserRepositoryrepository=factory.getRepository(用户资料库类);