2.7. 从聚合根发布事件
存储库管理的实体是聚合根。 在域驱动设计应用程序中,这些聚合根通常发布域事件。 Spring Data 提供了一个注释,称为您可以在聚合根的方法上使用该注释,以使该发布尽可能简单,如以下示例所示:@DomainEvents
例 42。从聚合根公开域事件
class AnAggregateRoot {
@DomainEvents
Collection<Object> domainEvents() {
// … return events you want to get published here
}
@AfterDomainEventPublication
void callbackMethod() {
// … potentially clean up domain events list
}
}
使用的方法可以返回单个事件实例或事件集合。 它绝不能接受任何论据。@DomainEvents |
发布所有事件后,我们有一个注释方法。 您可以使用它来潜在地清理要发布的事件列表(以及其他用途)。@AfterDomainEventPublication |
每次调用 Spring 数据存储库或方法之一时都会调用这些方法。save(…)
saveAll(…)
delete(…)
deleteAll(…)
2.8. 弹簧数据扩展
本节记录了一组 Spring 数据扩展,这些扩展允许在各种上下文中使用 Spring 数据。 目前,大多数集成都是针对Spring MVC的。
2.8.1. 查询扩展
Querydsl是一个框架,它支持通过其流畅的API构造静态类型的类似SQL的查询。
几个 Spring 数据模块提供与 Querydsl 的集成,如以下示例所示:QuerydslPredicateExecutor
例 43。QuerydslPredicateExecutor interface
public interface QuerydslPredicateExecutor<T> {
Optional<T> findById(Predicate predicate);
Iterable<T> findAll(Predicate predicate);
long count(Predicate predicate);
boolean exists(Predicate predicate);
// … more functionality omitted.
}
查找并返回与 匹配的单个实体。Predicate |
查找并返回与 匹配的所有实体。Predicate |
返回与 匹配的实体数。Predicate |
返回与实体匹配的实体是否存在。Predicate |
要使用 Querydsl 支持,请扩展存储库接口,如以下示例所示:QuerydslPredicateExecutor
例 44。存储库上的 querydsl 集成
interface UserRepository extends CrudRepository<User, Long>, QuerydslPredicateExecutor<User> {
}
前面的示例允许您使用 Querydslinstances 编写类型安全的查询,如以下示例所示:Predicate
Predicate predicate = user.firstname.equalsIgnoreCase("dave")
.and(user.lastname.startsWithIgnoreCase("mathews"));
userRepository.findAll(predicate);
2.8.2. 网页支持
支持存储库编程模型的 Spring 数据模块附带了各种 Web 支持。 与Web相关的组件要求Spring MVC JAR位于类路径上。 其中一些甚至提供与Spring HATEOAS的集成。 通常,集成支持是通过在 JavaConfig 配置类中使用注释来启用的,如以下示例所示:@EnableSpringDataWebSupport
例 45。启用 Spring 数据网络支持
@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
class WebConfiguration {}
注释注册了一些组件。 我们将在本节后面讨论这些内容。 它还检测类路径上的Spring HATEOAS,并为其注册集成组件(如果存在)。@EnableSpringDataWebSupport
或者,如果使用 XML 配置,请注册 要么 or Spring bean,如以下示例所示 (for):SpringDataWebConfiguration
HateoasAwareSpringDataWebConfiguration
SpringDataWebConfiguration
例 46。在XML中启用Spring Data Web支持
<bean class="org.springframework.data.web.config.SpringDataWebConfiguration" />
<!-- If you use Spring HATEOAS, register this one *instead* of the former -->
<bean class="org.springframework.data.web.config.HateoasAwareSpringDataWebConfiguration" />
基本网络支持
上一节中显示的配置注册了一些基本组件:
- A使用DomainClassConverter类让Spring MVC 从请求参数或路径变量解析存储库管理的域类的实例。
- HandlerMethodArgumentResolver实现,让 Spring MVC 从请求参数解析和实例。
Pageable
Sort
- 杰克逊模块,用于反序列化类型,或存储特定的类型,具体取决于所使用的 Spring 数据模块。
Point
Distance
使用类DomainClassConverter
该类允许您直接在Spring MVC控制器方法签名中使用域类型,这样您就不需要通过存储库手动查找实例,如以下示例所示:DomainClassConverter
例 47。在方法签名中使用域类型的Spring MVC控制器
@Controller
@RequestMapping("/users")
class UserController {
@RequestMapping("/{id}")
String showUserForm(@PathVariable("id") User user, Model model) {
model.addAttribute("user", user);
return "userForm";
}
}
该方法直接接收实例,无需进一步查找。 可以通过让Spring MVC首先将路径变量转换为域类的类型,并最终通过调用为域类型注册的存储库实例来访问实例来解决该实例。User
id
findById(…)
目前,存储库必须实现才有资格被发现进行转换。CrudRepository |
用于可分页和排序的处理程序方法参数解析器
上一节中显示的配置片段还注册了 aas 以及 的实例。 注册启用 sandas 有效控制器方法参数,如以下示例所示:PageableHandlerMethodArgumentResolver
SortHandlerMethodArgumentResolver
Pageable
Sort
例 48。使用可分页作为控制器方法参数
@Controller
@RequestMapping("/users")
class UserController {
private final UserRepository repository;
UserController(UserRepository repository) {
this.repository = repository;
}
@RequestMapping
String showUsers(Model model, Pageable pageable) {
model.addAttribute("users", repository.findAll(pageable));
return "users";
}
}
前面的方法签名导致Spring MVC尝试使用以下默认配置从请求参数派生实例:Pageable
表 1.为实例评估的请求参数Pageable
page | 要检索的页面。0 索引,默认为 0。 |
size | 要检索的页面的大小。默认值为 20。 |
sort | 应按格式排序的属性。默认排序方向为区分大小写的升序。如果要切换方向或区分大小写,请使用多个参数,例如。property,property(,ASC|DESC)(,IgnoreCase) sort ?sort=firstname&sort=lastname,asc&sort=city,ignorecase |
要定制此行为,请分别注册实现接口或接口的 Bean。 调用 Itsmethod,允许您更改设置,如以下示例所示:PageableHandlerMethodArgumentResolverCustomizer
SortHandlerMethodArgumentResolverCustomizer
customize()
@Bean SortHandlerMethodArgumentResolverCustomizer sortCustomizer() {
return s -> s.setPropertyDelimiter("<-->");
}
如果设置现有属性不足以满足您的目的,请扩展启用 HATEOAS 的等效项,覆盖理论方法,并导入自定义配置文件,而不是使用注释。MethodArgumentResolver
SpringDataWebConfiguration
pageableResolver()
sortResolver()
@Enable
如果您需要从请求中解析多个实例(例如,对于多个表),则可以使用 Spring'sannotation 来区分彼此。 然后,请求参数必须带有前缀。 下面的示例演示生成的方法签名:Pageable
Sort
@Qualifier
${qualifier}_
String showUsers(Model model,
@Qualifier("thing1") Pageable first,
@Qualifier("thing2") Pageable second) { … }
您必须填充,等等。thing1_page
thing2_page
默认传递给方法等效于 a,但您可以通过对参数使用注释来自定义它。Pageable
PageRequest.of(0, 20)
@PageableDefault
Pageable
对可分页的超媒体支持
Spring HATEOAS 附带了一个表示模型类 (),它允许使用必要的元数据和链接来丰富实例的内容,让客户端轻松浏览页面。 ato ais 的转换是通过 Spring HATEOAS接口的实现完成的,称为。 下面的示例演示如何使用 aas 控制器方法参数:PagedResources
Page
Page
Page
PagedResources
ResourceAssembler
PagedResourcesAssembler
PagedResourcesAssembler
例 49。使用 PagedResourcesAssembler 作为控制器方法参数
@Controller
class PersonController {
@Autowired PersonRepository repository;
@RequestMapping(value = "/persons", method = RequestMethod.GET)
HttpEntity<PagedResources<Person>> persons(Pageable pageable,
PagedResourcesAssembler assembler) {
Page<Person> persons = repository.findAll(pageable);
return new ResponseEntity<>(assembler.toResources(persons), HttpStatus.OK);
}
}
启用配置(如前面的示例所示)允许将 thebe 用作控制器方法参数。 呼叫它具有以下效果:PagedResourcesAssembler
toResources(…)
- 的内容成为实例的内容。
Page
PagedResources
- 对象被附加一个实例,并填充来自底层的信息。
PagedResources
PageMetadata
Page
PageRequest
- 附上可能获取链接,具体取决于页面的状态。 链接指向方法映射到的 URI。 添加到方法的分页参数与设置匹配,以确保以后可以解析链接。
PagedResources
prev
next
PageableHandlerMethodArgumentResolver
假设数据库中有 30 个实例。 您现在可以触发请求 () 并查看类似于以下内容的输出:Person
GET http://localhost:8080/persons
{ "links" : [ { "rel" : "next",
"href" : "http://localhost:8080/persons?page=1&size=20" }
],
"content" : [
… // 20 Person instances rendered here
],
"pageMetadata" : {
"size" : 20,
"totalElements" : 30,
"totalPages" : 2,
"number" : 0
}
}
汇编程序生成了正确的 URI,并且还选取了默认配置,以将参数解析为 afor 即将到来的请求。 这意味着,如果更改该配置,链接将自动遵循更改。 默认情况下,汇编程序指向在其中调用它的控制器方法,但您可以通过传递用作构建分页链接的基础的自定义来自定义该方法,这会重载该方法。Pageable
Link
PagedResourcesAssembler.toResource(…)
弹簧数据杰克逊模块
核心模块,以及一些特定于商店的模块,附带了一组杰克逊模块,用于Spring Data域使用的类似类型。
一旦启用了Web 支持并且可用,这些模块就会被导入。org.springframework.data.geo.Distance
org.springframework.data.geo.Point
com.fasterxml.jackson.databind.ObjectMapper
在初始化期间,就像 一样,由基础结构拾取,以便声明的 Jackson 可用。SpringDataJacksonModules
SpringDataJacksonConfiguration
com.fasterxml.jackson.databind.Module
ObjectMapper
以下域类型的数据绑定混合由通用基础结构注册。
org.springframework.data.geo.Distance
org.springframework.data.geo.Point
org.springframework.data.geo.Box
org.springframework.data.geo.Circle
org.springframework.data.geo.Polygon
单个模块可以提供额外的。 有关更多详细信息,请参阅商店特定部分。SpringDataJacksonModules
|
网页数据绑定支持
您可以使用 Spring Data 投影(在 [投影]中描述)通过使用 JSONPath 表达式(需要Jayway JsonPath)或XPath表达式(需要XmlBeam)来绑定传入的请求有效负载,如以下示例所示:
例 50。使用 JSONPath 或 XPath 表达式的 HTTP 有效负载绑定
@ProjectedPayload
public interface UserPayload {
@XBRead("//firstname")
@JsonPath("$..firstname")
String getFirstname();
@XBRead("/lastname")
@JsonPath({ "$.lastname", "$.user.lastname" })
String getLastname();
}
您可以使用前面示例中所示的类型作为 Spring MVC 处理程序方法参数,也可以使用 on 的方法之一。 前面的方法声明将尝试在给定文档中的任何地方查找。 XML 查找在传入文档的顶层执行。 它的 JSON 变体尝试顶级优先,但如果前者不返回值,也会尝试嵌套在子文档中。 这样,可以轻松缓解源文档结构中的更改,而无需客户端调用公开的方法(通常是基于类的有效负载绑定的缺点)。ParameterizedTypeReference
RestTemplate
firstname
lastname
lastname
lastname
user
支持嵌套投影,如 [投影] 中所述。 如果该方法返回复杂的非接口类型,则使用 Jacksonis 映射最终值。ObjectMapper
对于Spring MVC,一旦激活,就会自动注册必要的转换器,并且所需的依赖项在类路径上可用。 如需使用 ,请注册 (JSON) 或手动注册。@EnableSpringDataWebSupport
RestTemplate
ProjectingJackson2HttpMessageConverter
XmlBeamHttpMessageConverter
有关更多信息,请参阅规范的 Spring 数据示例存储库中的Web 投影示例。
查询网络支持
对于那些具有QueryDSL集成的存储,可以从查询字符串中包含的属性派生查询。Request
请考虑以下查询字符串:
?firstname=Dave&lastname=Matthews
给定前面示例中的对象,可以使用 将查询字符串解析为以下值,如下所示:User
QuerydslPredicateArgumentResolver
QUser.user.firstname.eq("Dave").and(QUser.user.lastname.eq("Matthews"))
当在类路径上找到 Querydsl 时,将自动启用该功能。@EnableSpringDataWebSupport |
将 ato 添加到方法签名提供了一个即用型,您可以使用 来运行。@QuerydslPredicate
Predicate
QuerydslPredicateExecutor
类型信息通常从方法的返回类型中解析。 由于该信息不一定与域类型匹配,因此最好使用 的属性。root QuerydslPredicate |
下面的示例演示如何在方法中使用签名:@QuerydslPredicate
@Controller
class UserController {
@Autowired UserRepository repository;
@RequestMapping(value = "/", method = RequestMethod.GET)
String index(Model model, @QuerydslPredicate(root = User.class) Predicate predicate,
Pageable pageable, @RequestParam MultiValueMap<String, String> parameters) {
model.addAttribute("users", repository.findAll(predicate, pageable));
return "index";
}
}
将查询字符串参数解析为匹配对象。Predicate User |
默认绑定如下所示:
-
Object
在简单属性上。eq
-
Object
在集合上像属性一样。contains
-
Collection
在简单属性上。in
您可以通过属性 ofor 自定义这些绑定,方法是使用 Java 8 并将方法添加到存储库接口,如下所示:bindings
@QuerydslPredicate
default methods
QuerydslBinderCustomizer
interface UserRepository extends CrudRepository<User, String>,
QuerydslPredicateExecutor<User>,
QuerydslBinderCustomizer<QUser> {
@Override
default void customize(QuerydslBindings bindings, QUser user) {
bindings.bind(user.username).first((path, value) -> path.contains(value))
bindings.bind(String.class)
.first((StringPath path, String value) -> path.containsIgnoreCase(value));
bindings.excluding(user.password);
}
}
QuerydslPredicateExecutor 提供对特定查找器方法的访问。Predicate |
QuerydslBinderCustomizer 在存储库界面上定义的自动拾取和快捷方式。@QuerydslPredicate(bindings=…) |
将属性的绑定定义为简单绑定。username contains |
将属性的默认绑定定义为不区分大小写的匹配项。String contains |
从解析中排除该属性。password Predicate |
您可以在从存储库或应用特定绑定之前注册持有默认 Querydsl 绑定的 abean。QuerydslBinderCustomizerDefaults @QuerydslPredicate |
2.8.3. 仓库填充器
如果您使用 Spring JDBC 模块,您可能熟悉对填充 SQL 脚本的支持。 类似的抽象在存储库级别可用,尽管它不使用 SQL 作为数据定义语言,因为它必须独立于存储。 因此,填充器支持XML(通过Spring的OXM抽象)和JSON(通过Jackson)来定义用于填充存储库的数据。DataSource
假设您有一个包含以下内容的文件:data.json
例 51。在 JSON 中定义的数据
[ { "_class" : "com.acme.Person",
"firstname" : "Dave",
"lastname" : "Matthews" },
{ "_class" : "com.acme.Person",
"firstname" : "Carter",
"lastname" : "Beauford" } ]
您可以使用 Spring 数据共享中提供的存储库命名空间的填充器元素来填充存储库。 若要将上述数据填充到 ur,请声明类似于以下内容的填充器:PersonRepository
例 52。声明杰克逊存储库填充器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:repository="http://www.springframework.org/schema/data/repository"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/repository
https://www.springframework.org/schema/data/repository/spring-repository.xsd">
<repository:jackson2-populator locations="classpath:data.json" />
</beans>
前面的声明会导致 Jackson 读取和反序列化该文件。data.json
ObjectMapper
JSON 对象解组的类型是通过检查 JSON 文档的属性来确定的。 基础结构最终会选择适当的存储库来处理反序列化的对象。_class
要改用 XML 来定义存储库应填充的数据,您可以使用 theelement。 您可以将其配置为使用 Spring OXM 中可用的 XML 编组选项之一。有关详细信息,请参阅Spring 参考文档。 以下示例显示如何使用 JAXB 取消编组存储库填充器:unmarshaller-populator
例 53。声明解组存储库填充器(使用 JAXB)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:repository="http://www.springframework.org/schema/data/repository"
xmlns:oxm="http://www.springframework.org/schema/oxm"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/repository
https://www.springframework.org/schema/data/repository/spring-repository.xsd
http://www.springframework.org/schema/oxm
https://www.springframework.org/schema/oxm/spring-oxm.xsd">
<repository:unmarshaller-populator locations="classpath:data.json"
unmarshaller-ref="unmarshaller" />
<oxm:jaxb2-marshaller contextPath="com.acme" />
</beans>
3. 参考文档
3.1. 什么是 Spring 数据转换器?
Spring Data Envers 在 Spring Data JPA 的存储库中提供了典型的 Envers 查询。 它与其他 Spring 数据模块的不同之处在于,它总是与另一个 Spring 数据模块结合使用:Spring Data JPA。
3.2. 什么是Envers?
Envers 是一个Hibernate 模块,它为 JPA 实体添加了审计功能。 本文档假设您熟悉Envers,就像Spring Data Envers依赖于正确配置Envers一样。
3.3. 配置
作为使用 Spring Data Envers 的起点,您需要一个在类路径上具有 Spring Data JPA 的项目和一个额外的依赖项:spring-data-envers
<dependencies>
<!-- other dependency elements omitted -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-envers</artifactId>
<version>2.7.6</version>
</dependency>
</dependencies>
这也将项目作为暂时性依赖项引入。hibernate-envers
要启用 Spring Data Envers 和 Spring Data JPA,我们需要配置两个 bean 和一个特殊的:repositoryFactoryBeanClass
@Configuration
@EnableEnversRepositories
@EnableTransactionManagement
public class EnversDemoConfiguration {
@Bean
public DataSource dataSource() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
return builder.setType(EmbeddedDatabaseType.HSQL).build();
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("example.springdata.jpa.envers");
factory.setDataSource(dataSource());
return factory;
}
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory);
return txManager;
}
}
要实际使用 Spring Data Envers,请将一个或多个存储库添加到RevisionRepository中,将其添加为扩展接口:
interface PersonRepository
extends CrudRepository<Person, Long>,
RevisionRepository<Person, Long, Long>
{}
第一个类型参数 () 表示实体类型,第二个 () 表示 id 属性的类型,最后一个参数 () 是修订号的类型。
对于默认配置中的 Envers,修订号参数应为 OR。Person Long Long Integer Long |
该存储库的实体必须是启用了 Envers 审核的实体(即,它必须具有注释):@Audited
@Entity
@Audited
class Person {
@Id @GeneratedValue
Long id;
String name;
@Version Long version;
}
3.4. 用法
现在,您可以使用 from 方法查询实体的修订,如以下测试用例所示:RevisionRepository
@ExtendWith(SpringExtension.class)
@Import(EnversDemoConfiguration.class)
class EnversIntegrationTests {
final PersonRepository repository;
final TransactionTemplate tx;
EnversIntegrationTests(@Autowired PersonRepository repository, @Autowired PlatformTransactionManager tm) {
this.repository = repository;
this.tx = new TransactionTemplate(tm);
}
@Test
void testRepository() {
Person updated = preparePersonHistory();
Revisions<Long, Person> revisions = repository.findRevisions(updated.id);
Iterator<Revision<Long, Person>> revisionIterator = revisions.iterator();
checkNextRevision(revisionIterator, "John", RevisionType.INSERT);
checkNextRevision(revisionIterator, "Jonny", RevisionType.UPDATE);
checkNextRevision(revisionIterator, null, RevisionType.DELETE);
assertThat(revisionIterator.hasNext()).isFalse();
}
/**
* Checks that the next element in the iterator is a Revision entry referencing a Person
* with the given name after whatever change brought that Revision into existence.
* <p>
* As a side effect the Iterator gets advanced by one element.
*
* @param revisionIterator the iterator to be tested.
* @param name the expected name of the Person referenced by the Revision.
* @param revisionType the type of the revision denoting if it represents an insert, update or delete.
*/
private void checkNextRevision(Iterator<Revision<Long, Person>> revisionIterator, String name,
RevisionType revisionType) {
assertThat(revisionIterator.hasNext()).isTrue();
Revision<Long, Person> revision = revisionIterator.next();
assertThat(revision.getEntity().name).isEqualTo(name);
assertThat(revision.getMetadata().getRevisionType()).isEqualTo(revisionType);
}
/**
* Creates a Person with a couple of changes so it has a non-trivial revision history.
* @return the created Person.
*/
private Person preparePersonHistory() {
Person john = new Person();
john.setName("John");
// create
Person saved = tx.execute(__ -> repository.save(john));
assertThat(saved).isNotNull();
saved.setName("Jonny");
// update
Person updated = tx.execute(__ -> repository.save(saved));
assertThat(updated).isNotNull();
// delete
tx.executeWithoutResult(__ -> repository.delete(updated));
return updated;
}
}
这引用了前面介绍的应用程序上下文配置(在“配置”部分中)。 |
3.5. 更多资源
您可以在 Spring数据示例存储库中下载 Spring 数据示例示例,并尝试一下库的工作原理。
您还应该查看Javadoc forRevisionRepository和相关类。
您可以在Stackoverflow 上使用spring-data-envers标签提问。
Spring Data Envers的源代码和问题跟踪器托管在GitHub上。
4. 附录
附录 A:命名空间引用
元素<repositories />
该元素触发了 Spring 数据存储库基础结构的设置。最重要的属性是,它定义了要扫描 Spring 数据存储库接口的包。请参阅“XML 配置”。下表描述了元素的属性:<repositories />
base-package
<repositories />
Table 2. Attributes
名字
| 描述
|
base-package | 定义要扫描的包,以查找在自动检测模式下扩展的存储库接口(实际接口由特定的 Spring 数据模块确定)。还会扫描已配置软件包下的所有软件包。允许使用通配符。*Repository |
repository-impl-postfix | 定义用于自动检测自定义存储库实现的后缀。名称以配置的后缀结尾的类被视为候选类。默认为。Impl |
query-lookup-strategy | 确定用于创建查找器查询的策略。有关详细信息,请参阅“查询查找策略”。默认为。create-if-not-found |
named-queries-location | 定义搜索包含外部定义查询的属性文件的位置。 |
consider-nested-repositories | 是否应考虑嵌套存储库接口定义。默认为。false |
附录 B:填充器命名空间参考
<填充器 /> 元素
该元素允许通过 Spring 数据存储库基础架构填充数据存储。[1]<populator />
Table 3. Attributes
名字
| 描述
|
locations | 应填充从存储库中查找要读取对象的文件的位置。 |
附录 C:存储库查询关键字
支持的查询方法主题关键字
下表列出了 Spring 数据存储库查询派生机制通常支持的主题关键字,以表达谓词。 有关支持的关键字的确切列表,请参阅特定于商店的文档,因为此处列出的某些关键字可能在特定商店中不受支持。
Table 4. Query subject keywords
关键词
| 描述
|
find…By , , , , , read…By get…By query…By search…By stream…By | 常规查询方法通常返回存储库类型、主子类型或结果包装器(如),或任何其他特定于存储的结果包装器。可以用作,或与其他关键字结合使用。Collection Streamable Page GeoResults findBy… findMyDomainTypeBy… |
exists…By | 存在投影,返回通常为结果。boolean |
count…By | 计数投影返回数值结果。 |
delete…By , remove…By | 删除查询方法不返回任何结果 () 或删除计数。void |
…First<number>… , …Top<number>… | 将查询结果限制为第一个结果。此关键字可以出现在主题(和其他关键字)之间的任何位置。<number> find by |
…Distinct… | 使用非重复查询仅返回唯一结果。请参阅特定于商店的文档是否支持该功能。此关键字可以出现在主题(和其他关键字)之间的任何位置。find by |
支持的查询方法谓词关键字和修饰符
下表列出了 Spring 数据存储库查询派生机制通常支持的谓词关键字。 但是,请参阅特定于商店的文档,了解支持的关键字的确切列表,因为此处列出的某些关键字可能在特定商店中不受支持。
Table 5. Query predicate keywords
逻辑关键字
| 关键字表达式
|
AND | And |
OR | Or |
AFTER | After , IsAfter |
BEFORE | Before , IsBefore |
CONTAINING | Containing , , IsContaining Contains |
BETWEEN | Between , IsBetween |
ENDING_WITH | EndingWith , , IsEndingWith EndsWith |
EXISTS | Exists |
FALSE | False , IsFalse |
GREATER_THAN | GreaterThan , IsGreaterThan |
GREATER_THAN_EQUALS | GreaterThanEqual , IsGreaterThanEqual |
IN | In , IsIn |
IS | Is ,,(或无关键字)Equals |
IS_EMPTY | IsEmpty , Empty |
IS_NOT_EMPTY | IsNotEmpty , NotEmpty |
IS_NOT_NULL | NotNull , IsNotNull |
IS_NULL | Null , IsNull |
LESS_THAN | LessThan , IsLessThan |
LESS_THAN_EQUAL | LessThanEqual , IsLessThanEqual |
LIKE | Like , IsLike |
NEAR | Near , IsNear |
NOT | Not , IsNot |
NOT_IN | NotIn , IsNotIn |
NOT_LIKE | NotLike , IsNotLike |
REGEX | Regex , , MatchesRegex Matches |
STARTING_WITH | StartingWith , , IsStartingWith StartsWith |
TRUE | True , IsTrue |
WITHIN | Within , IsWithin |
除了筛选器谓词之外,还支持以下修饰符列表:
Table 6. Query predicate modifier keywords
关键词
| 描述
|
IgnoreCase , IgnoringCase | 与谓词关键字一起使用,用于不区分大小写的比较。 |
AllIgnoreCase , AllIgnoringCase | 忽略所有合适属性的大小写。在查询方法谓词中的某处使用。 |
OrderBy… | 指定静态排序顺序,后跟属性路径和方向(例如)。OrderByFirstnameAscLastnameDesc |