IntelliJ IDEA 2025.1 Help

Spring Data

Spring Data JPA 是更大的 Spring Data 家族的一部分,使得能够快速实现基于 JPA 的代码库变得容易。 JPA Buddy 提供一个清晰的用户界面,用于生成 Java 和 Kotlin 实体的存储库、投影、查询等。 要启用这些功能,您的项目应包含 安装指南中提到的依赖项。

仓库创建

JPA Buddy 提供多种方式创建仓库,使大多数用户使用与 JPA 相关的对象更加方便。 项目中生成存储库的所有可能方法都在以下视频中显示:

在“New JPA Repository”窗口中,您可以设置:

new-jpa-repository

为每个实体一个个创建 Spring Data 仓库可能会成为一项繁琐的工作。 有了 JPA Buddy,您可以加速这一过程。 要同时为多个 JPA 实体创建存储库,您需要执行三个步骤。 在项目树中选择实体,调用 JPA Buddy 向导,然后调整您的选择。 就是这样! 看看这个功能如何加速开发过程:

JPA 结构存储库

JPA Buddy 将每个实体的所有存储库集中在一个地方,以实现项目内最有效的导航。 无论实体的仓库位于不同项目包还是相同项目包中,这都无关紧要。 与该实体相关的所有存储库都将显示在 仓库 部分。 从这里,您可以快速移动到 repository 实现或创建一个新的实现。

jpa-structure-repository

查询/方法生成

Spring Data 提供了使用 @Query 注解定义查询的能力。 您可以使用 JPA Palette (1) 或 Editor Toolbar (2) 快速编写它们并避免拼写错误。 请选择以下类型的查询之一,并使用便捷的 UI 进行配置。

jpa-palette-query

示例

让我们来看一个创建 Find Collection Query 的例子。

create-query-find-collection

在窗口顶部,您可以定义集合和查询返回类型的换行类型。 此外,JPA Buddy 还允许您通过点击 + 按钮生成新的 Projection 接口DTO 类

您还可以指定方法名。 不过,如果您将其留空,名称将根据 查询命名规范自动生成。

窗口中间包含查询条件的表格。

在窗口底部,您可以指定:

  • 参数是否会被命名;

  • 是否使用 Pageable 参数;

  • 至关重要

最后,您可以指定要按顺序排列查询结果的字段。

对于上述配置,将生成以下查询:

@Query(""" select distinct o from Owner o where upper(o.firstName) like upper(concat(:firstName, '%')) and upper(o.lastName) like upper(concat('%', :lastName, '%')) order by o.lastName """) @Async CompletableFuture<List<Owner>> findOwners(@Param("firstName") String firstName, @Param("lastName") @NonNull String lastName, Pageable pageable);

同样的方法适用于派生查询方法。 可以使用 Method prefix 下拉菜单来定义所需的主题关键字并添加别名,而不是使用 Method name 字段。

derived-query-method-prefix

这允许您自定义生成的查询方法的命名约定,从而在代码中提供灵活性和一致性。

实体 意图

JPA Buddy 还在实体属性上提供了直接进入查询/方法创建窗口的意图。 将文本光标放置在所需的属性上,按 Alt+Enter ,然后点击创建 Spring Data 存储库方法。 在打开的窗口中,选择所需的query/method类型。

未解析的引用

JPA Buddy 可以帮助那些喜欢先调用尚不存在的方法然后再实现它的开发人员。 只需编写所需的签名,然后通过特殊操作进入查询或方法创建向导:

未解析引用

设置

Spring Data 提供了几种用于派生查询方法名称的关键字表达式。 您可以使用 NameContaining、NameIsContaining 或 NameContains——结果是一样的。 一方面,它在方法命名上给了我们一些灵活性。 另一方面,在大团队中,对相同操作使用不同命名可能会使代码审查员和维护人员感到困惑。 如果您的开发团队已经建立了命名标准,您可以配置 JPA Buddy 仅使用批准的关键字来生成方法名称:

conditions-settings

现有方法/查询修改

要配置方法或查询,请将光标放在其上并使用 JPA Inspector:

jpa-inspector

实体图支持

在 JPA 2.1 中引入的 EntityGraph 是最受期待的特性之一。 实体图为我们提供了另一层数据获取控制。 JPA Buddy 也支持它们,所以您可以使用方便的 GUI 向导构建图表:

查询重构

异步

Spring Data JPA 提供异步运行存储库查询的能力。 要使查询异步化,仅添加 '@Async' 注解是不够的,还需要将返回类型更改为以下之一:

  • Future<ClassName>

  • CompletableFuture<ClassName>

  • ListenableFuture<ClassName>

了解有关异步查询结果的更多信息,请参阅相应的 Spring Data JPA 文档

要使查询异步,请将文本光标放在您要更改的查询上,并从下拉列表中选择结果返回类型:

异步

动态投影

在 Spring Data JPA 中,您可以使用通用 repository 方法在运行时指定投影。 向您的存储库方法添加类型类参数,以便使用相同的查询进行不同的投影。 这使您能够在业务代码中定义首选的返回类型。

要使查询变为通用,请将文本光标放在您要更改的查询上,并勾选“动态投影”框。

动态投影

查询提取

派生查询方法是定义查询的一个方便方式。 但是,随着时间的推移,它们可能会演变成庞大且不可读的结构,您可以将其转换为整洁的 @Query-注释方法。 这可以通过 JPA Buddy 轻松实现。 将文本光标置于查询上,然后在 JPA Inspector 中点击“Query extract...”。

查询自动完成

对于 IntelliJ IDEA 社区版,JPA Buddy 提供查询自动完成功能(类似于 IntelliJ IDEA 旗舰版提供的功能)。 将文本光标放在查询上,然后在 JPA Inspector 中点击“Query edit...”。

投影

有时您只需要表中的一部分列。 在这种情况下,Spring Data JPA 投影很有用,允许您仅从查询中返回所需的字段。

新建 Spring 投影 窗口中,您可以:

  • 定义源根和包;

  • 选择实体类;

  • 为投影类设置名称;

  • 选择您想要包含的字段。

此外,JPA Buddy 允许您为引用的实体生成 Projections。 选择关联实体,选择投影类型,并选择所需的字段。

new-spring-projection

对于上述配置,将生成以下投影:

/** * A Projection for the {@link Pet} entity */ public interface PetInfo { Integer getId(); String getName(); LocalDate getBirthDate(); PetTypeInfo getType(); OwnerInfo getOwner(); /** * A Projection for the {@link PetType} entity */ interface PetTypeInfo { Integer getId(); String getName(); } /** * A Projection for the {@link Owner} entity */ interface OwnerInfo { String getFirstName(); String getLastName(); } }

保持 Projections 与其 JPA 实体同步

随着时间的推移,实体可能会发生变化,您需要相应地更改投影。 JPA Buddy 允许您将实体与其投影进行同步,反之亦然。 请参阅 DTO Generator 部分以了解此功能的详细信息。

投影声明设置

每个项目可能会遵循其自身的代码编写惯例。 在工具 -> JPA Buddy -> 投影声明中,您可以配置:

  1. 类名后缀.

  2. 名称模式正则表达式(当字段为空时功能被禁用)。 如果您对 Projections 使用强制命名约定,此选项很有用。 它允许 JPA Buddy 仅使用 Projection 名称将 Projection 与其 JPA Entity 关联。 要为目标 JPA 实体的简单类名指定占位符,请使用 (?<entity>.) 模式。 例如, (?<entity>.*(?:Info|Prj|Projection|VO|Vo|View|Request|Browse) 表示 MyEntityInfoMyEntityPrj 等。 类将被视为 MyEntity 的投影。

  3. 类注释. 定义将在 Projection 接口上生成的注释。

  4. 评论链接的正则表达式(当字段为空时,该功能被禁用)。 此选项允许 JPA Buddy 将 Projection 与其 JPA Entity 关联。 要在注释中为目标实体 FQN(全限定名)指定占位符,请使用 (?<entity>.*) 模式。 那么,如果 regexp 被定义为 A Projection for the \{@link (?<entity>.*)\} entity 它将在以下 Javadoc 注释中解析:

/** * A Projection for the {@link Pet} entity */
projection-declaration

实体及其投影之间的便捷导航

一旦 JPA Buddy 能够将 Projection 接口与实体关联:

  • Projection 接口将出现在 JPA Structure 面板的 Dto & Projections 部分和 Editor Toolbar 中(1)

  • 在投影中将出现装订区域图标,以便于导航到其实体(2)

projection-navigation

审核支持

在大型应用程序中,进行审计是至关重要的。 JPA Buddy 通过为常用审计字段提供注释(如 @CreatedBy@CreatedDate@LastModifiedBy@LastModifiedDate ),使其变得轻而易举。 此外,JPA Buddy 会在您忘记将 @EnableJpaAuditing 注释添加到您的配置中,或未将 AuditingEntityListener 添加到当前实体时通知您。 这就更没有犯错的余地了!

标签:Spring Data、JPA、Projections、审计、DTO、查询、Repository、实体、JPQL、本机查询、动态 Projections

Blaze Persistence 支持

Blaze-Persistence 无缝集成了 Spring Data JPA,允许您在利用高级查询和优化功能的同时,从 Spring Data 的便利性和生产力中受益。 JPA Buddy 提供对该框架的支持,以创建 Entity Views 的 Spring Data JPA 存储库,但仅当项目中包含 相关库时。

从标准仓库创建窗口创建用于实体视图的 Spring Data JPA 仓库是可用的。 一旦您选择了一个 Entity View,父接口的唯一选项是 com.blazebit.persistence.spring.data.repository.EntityViewRepository 或其继任者之一。

blaze-persistence-spring-data-repository.png
import com.blazebit.persistence.spring.data.repository.EntityViewRepository; import com.example.blazepersistence.view.BaseView; public interface BaseViewRepository extends EntityViewRepository<BaseView, Long> { }

Hibernate Envers 支持

JPA Buddy 允许您在创建 JPA 存储库时决定该存储库是否应实现 RevisionRepository 接口。 它将自动在仓库声明中插入实体类型、实体 ID 类型和修订号类型。 例如:

@Entity @Table(name = "book") public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false) private Long id; }
修订库

生成的存储库声明:

public interface BookRepository extends JpaRepository<Book, Long>, RevisionRepository<Book, Long, Integer> { }
最后修改日期: 2025年 4月 24日