• 如何在 Spring Boot 中使用 JPA 和 JPQL 进行自定义查询示例


    在本教程中,您将了解如何在 Spring Boot 示例中使用 Spring JPA @Query进行自定义查询。我将向您展示:

    • 使用JPQL(Java持久性查询语言)的方法
    • 如何在 Spring 引导中执行 SQL 查询
    • 具有 WHERE 条件的 JPA 选择查询示例

    JPQL 与本机查询

    Spring JPA 同时支持 JPQL 和 Native Query。

    Jakarta Persistence Query Language(JPQL;以前称为Java Persistence Query Language)是一种独立于平台的面向对象的查询语言,定义为Jakarta Persistence(JPA;以前称为Java Persistence API)规范的一部分 - 维基百科

    JPQL 的灵感来自 SQL,其查询在语法上类似于 SQL 查询,但针对存储在关系数据库中的 JPA 实体对象进行操作,而不是直接使用数据库表。

    以下是使用 JPQL 和@Query注释的自定义查询示例:

    1. @Query("SELECT t FROM Tutorial t")
    2. List findAll();
    3. @Query("SELECT t FROM Tutorial t WHERE t.published=true")
    4. List findByPublished();

    JPQL 仅支持 SQL 标准的子集。如果要进行复杂的查询,请查看本机 SQL 查询。
    这是如何在 Spring Boot 中执行 SQL 查询的方法,带有@Query注释:

    1. @Query(value = "SELECT * FROM tutorials", nativeQuery = true)
    2. List findAllNative();
    3. @Query(value = "SELECT * FROM tutorials t WHERE t.published=true", nativeQuery = true)
    4. List findByPublishedNative();

    您需要注意:
    – Spring Data JPA 不会将查询调整为数据库的特定 SQL 方言,因此请确保提供的语句受 RDBMS 支持。
    – Spring Data JPA目前不支持本机查询的动态排序,因为它必须操作声明的实际查询,这对于本机SQL无法可靠地执行。

    例如,我们不能在以下方法中使用动态排序:

    1. // JPQL: ok
    2. @Query("SELECT * FROM tutorials t WHERE t.title LIKE %?1%")
    3. List findByTitleAndSort(String title, Sort sort);
    4. // Native query: throw InvalidJpaQueryMethodException
    5. @Query(value = "SELECT * FROM tutorials t WHERE t.title LIKE %?1%", nativeQuery = true)
    6. List findByTitleAndSortNative(String title, Sort sort);

    有关更多详细信息,请访问:
    使用 Spring 引导的 JPA 本机查询示例

    让我们看看我们如何在 Spring Boot 中使用 JPA 和 JPQL 示例进行自定义查询。

    Spring JPA @Query Spring Boot 的示例

    –科技:

    • Java 8
    • Spring Boot 2.6.3 (with Spring Data JPA)
    • MySQL/PostgreSQL/H2 (embedded database)
    • Maven 3.8.1

    – 项目结构:

     

    让我简要解释一下。

    • Tutorial数据模型类对应于实体和表tutorials
    • TutorialRepository是一个扩展JpaRepository的接口,用于 CRUD 方法和自定义查找器方法。它将被SpringBootQueryExampleApplication自动连接。
    • SpringBootQueryExampleApplication是个SpringBootApplication实现CommandLineRunner。我们将在TutorialRepository里运行查询方法。
       
    • application.properties中配置Spring Datasource,JPA和Hibernate。
    • pom.xml包含 Spring Boot 和 MySQL/PostgreSQL/H2 数据库的依赖项。

    创建和设置 Spring Boot 项目

    使用 Spring Web 工具或您的开发工具Spring Tool Suite、Eclipse、NetBeans、Intellij)创建 Spring Boot 项目。

    然后打开pom.xml并添加以下依赖项:

    1. <dependency>
    2. <groupId>org.springframework.bootgroupId>
    3. <artifactId>spring-boot-starter-webartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-data-jpaartifactId>
    8. dependency>

    我们还需要再添加一个依赖项。
    如果你想使用MySQL

    1. <dependency>
    2. <groupId>mysqlgroupId>
    3. <artifactId>mysql-connector-javaartifactId>
    4. <scope>runtimescope>
    5. dependency>

    – 或PostgreSQL

    1. <dependency>
    2. <groupId>org.postgresqlgroupId>
    3. <artifactId>postgresqlartifactId>
    4. <scope>runtimescope>
    5. dependency>

    – 或H2(嵌入式数据库):

    1. <dependency>
    2. <groupId>com.h2databasegroupId>
    3. <artifactId>h2artifactId>
    4. <scope>runtimescope>
    5. dependency>

    配置 Spring 数据源、JPA、Hibernate

    在 src/main/resources 文件夹下,打开 application.properties 并编写这些行。

    – 对于 MySQL:

    1. spring.datasource.url= jdbc:mysql://localhost:3306/testdb?useSSL=false
    2. spring.datasource.username= root
    3. spring.datasource.password= 123456
    4. spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.MySQL5InnoDBDialect
    5. # Hibernate ddl auto (create, create-drop, validate, update)
    6. spring.jpa.hibernate.ddl-auto= update

    对于PostgreSQL:

    1. spring.datasource.url= jdbc:postgresql://localhost:5432/testdb
    2. spring.datasource.username= postgres
    3. spring.datasource.password= 123
    4. spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation= true
    5. spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.PostgreSQLDialect
    6. # Hibernate ddl auto (create, create-drop, validate, update)
    7. spring.jpa.hibernate.ddl-auto= update
    • spring.datasource.username & spring.datasource.password属性与数据库安装相同。
    • Spring Boot 使用 Hibernate 进行 JPA 实现,我们配置 MySQL MySQL5InnoDBDialect或 PostgreSQL PostgreSQLDialect
    • spring.jpa.hibernate.ddl-auto用于数据库初始化。我们将值设置为值update,以便在数据库中自动创建一个与定义的数据模型对应的表。对模型的任何更改也将触发对表的更新。对于生产,此属性应该是validate。​​​​​​​

    – 对于 H2 数据库:

    1. spring.datasource.url=jdbc:h2:mem:testdb
    2. spring.datasource.driverClassName=org.h2.Driver
    3. spring.datasource.username=sa
    4. spring.datasource.password=
    5. spring.jpa.show-sql=true
    6. spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
    7. spring.jpa.hibernate.ddl-auto= update
    8. spring.h2.console.enabled=true
    9. # default path: h2-console
    10. spring.h2.console.path=/h2-ui
    • spring.datasource.urljdbc:h2:mem:[database-name]内存数据库和jdbc:h2:file:[path/database-name]用于基于磁盘的数据库。​​​​​​​
    • 我们为 H2 数据库配置配置H2Dialect
    • spring.h2.console.enabled=true告诉 Spring 启动 H2 数据库管理工具,您可以在浏览器上访问此工具:http://localhost:8080/h2-console
    • spring.h2.console.path=/h2-ui用于 H2 控制台的 URL,因此默认 url http://localhost:8080/h2-console将更改为http://localhost:8080/h2-ui。​​​​​​​

    创建实体

    model 包中,我们定义类Tutorial

    教程有六个字段:id, title, level, description, published, createdAt

    model/Tutorial.java

    1. package com.bezkoder.spring.query.model;
    2. import javax.persistence.*;
    3. import java.util.Date;
    4. @Entity
    5. @Table(name = "tutorials")
    6. public class Tutorial {
    7. @Id
    8. @GeneratedValue(strategy = GenerationType.AUTO)
    9. private long id;
    10. private String title;
    11. private String description;
    12. private int level;
    13. private boolean published;
    14. @Temporal(TemporalType.TIMESTAMP)
    15. private Date createdAt;
    16. public Tutorial() {
    17. }
    18. public Tutorial(String title, String description, int level, boolean published, Date createdAt) {
    19. this.title = title;
    20. this.description = description;
    21. this.level = level;
    22. this.published = published;
    23. this.createdAt = createdAt;
    24. }
    25. // getters and setters
    26. }

    @Entity注释表示该类是持久性 Java 类。

    @Table注释提供映射此实体的表。

    @Id注释用于主键。
    @GeneratedValue注释用于定义主键的生成策略。​​​​​​​

    @Temporal注释在时间戳和或java.util.Date之间来回转换到时间。例如,@Temporal(TemporalType.DATE)删除时间值并仅保留日期。​​​​​​​​​​​​​​

    1. @Temporal(TemporalType.DATE)
    2. private Date createdAt;

    使用 JPA 自定义查询方法定义存储库

    让我们创建一个存储库来与数据库进行交互。
    repository 包中,创建TutorialRepository扩展​​​​​​​JpaRepository接口。

    repository/TutorialRepository.java

    1. package com.bezkoder.spring.query.repository;
    2. import com.bezkoder.spring.query.model.Tutorial;
    3. public interface TutorialRepository extends JpaRepository {
    4. }

    在此接口中,我们将编写 JPA Select 查询(带有 where 条件)以从数据库中获取数据。
    我将向您展示如何在 Spring Boot 中使用 JPQL 查询示例。

    假设我们已经有了这样的tutorials 表:

     

    JPA 选择查询,WHERE条件示例

    让我们使用@Query注释来创建带有 SELECT 和 WHERE 关键字的 Spring JPA 查询。

    1. @Query("SELECT t FROM Tutorial t")
    2. List findAll();
    3. @Query("SELECT t FROM Tutorial t WHERE t.published=?1")
    4. List findByPublished(boolean isPublished);
    5. @Query("SELECT t FROM Tutorial t WHERE t.title LIKE %?1%")
    6. List findByTitleLike(String title);
    7. @Query("SELECT t FROM Tutorial t WHERE LOWER(t.title) LIKE LOWER(CONCAT('%', ?1,'%'))")
    8. List findByTitleLikeCaseInsensitive(String title);

    结果:

    1. List tutorials = new ArrayList<>();
    2. tutorials = tutorialRepository.findAll();
    3. show(tutorials);
    4. /*
    5. Tutorial [id=1, title=Spring Data, description=Tut#1 Description, level=3, published=true, createdAt=2022-03-11 00:00:00.0]
    6. Tutorial [id=2, title=Java Spring, description=Tut#2 Description, level=1, published=false, createdAt=2022-03-11 00:00:00.0]
    7. Tutorial [id=3, title=Hibernate, description=Tut#3 Description, level=3, published=true, createdAt=2022-04-26 00:00:00.0]
    8. Tutorial [id=4, title=Spring Boot, description=Tut#4 Description, level=2, published=false, createdAt=2022-04-26 00:00:00.0]
    9. Tutorial [id=5, title=Spring Data JPA, description=Tut#5 Description, level=3, published=true, createdAt=2022-05-19 00:00:00.0]
    10. Tutorial [id=6, title=Spring Batch, description=Tut#6 Description, level=4, published=false, createdAt=2022-05-19 00:00:00.0]
    11. Tutorial [id=7, title=Spring Security, description=Tut#7 Description, level=5, published=false, createdAt=2022-05-19 00:00:00.0]
    12. */
    13. tutorials = tutorialRepository.findByPublished(true);
    14. show(tutorials);
    15. /*
    16. Tutorial [id=1, title=Spring Data, description=Tut#1 Description, level=3, published=true, createdAt=2022-03-11 00:00:00.0]
    17. Tutorial [id=3, title=Hibernate, description=Tut#3 Description, level=3, published=true, createdAt=2022-04-26 00:00:00.0]
    18. Tutorial [id=5, title=Spring Data JPA, description=Tut#5 Description, level=3, published=true, createdAt=2022-05-19 00:00:00.0]
    19. */
    20. tutorials = tutorialRepository.findByTitleLike("ata");
    21. show(tutorials);
    22. /*
    23. Tutorial [id=1, title=Spring Data, description=Tut#1 Description, level=3, published=true, createdAt=2022-03-11 00:00:00.0]
    24. Tutorial [id=5, title=Spring Data JPA, description=Tut#5 Description, level=3, published=true, createdAt=2022-05-19 00:00:00.0]
    25. */
    26. tutorials = tutorialRepository.findByTitleLikeCaseInsensitive("dat");
    27. show(tutorials);
    28. /*
    29. Tutorial [id=1, title=Spring Data, description=Tut#1 Description, level=3, published=true, createdAt=2022-03-11 00:00:00.0]
    30. Tutorial [id=5, title=Spring Data JPA, description=Tut#5 Description, level=3, published=true, createdAt=2022-05-19 00:00:00.0]
    31. */

    JPA 查询大于或等于

    春季数据 JPA 查询大于或等于日期/列:

    1. @Query("SELECT t FROM Tutorial t WHERE t.level >= ?1")
    2. List findByLevelGreaterThanEqual(int level);
    3. @Query("SELECT t FROM Tutorial t WHERE t.createdAt >= ?1")
    4. List findByDateGreaterThanEqual(Date date);

    结果:

    1. tutorials = tutorialRepository.findByLevelGreaterThanEqual(3);
    2. show(tutorials);
    3. /*
    4. Tutorial [id=1, title=Spring Data, description=Tut#1 Description, level=3, published=true, createdAt=2022-03-11 00:00:00.0]
    5. Tutorial [id=3, title=Hibernate, description=Tut#3 Description, level=3, published=true, createdAt=2022-04-26 00:00:00.0]
    6. Tutorial [id=5, title=Spring Data JPA, description=Tut#5 Description, level=3, published=true, createdAt=2022-05-19 00:00:00.0]
    7. Tutorial [id=6, title=Spring Batch, description=Tut#6 Description, level=4, published=false, createdAt=2022-05-19 00:00:00.0]
    8. Tutorial [id=7, title=Spring Security, description=Tut#7 Description, level=5, published=false, createdAt=2022-05-19 00:00:00.0]
    9. */
    10. Date myDate = new SimpleDateFormat("yyyy-MM-dd").parse("2022-05-11");
    11. tutorials = tutorialRepository.findByDateGreaterThanEqual(myDate);
    12. show(tutorials);
    13. /*
    14. Tutorial [id=5, title=Spring Data JPA, description=Tut#5 Description, level=3, published=true, createdAt=2022-05-19 00:00:00.0]
    15. Tutorial [id=6, title=Spring Batch, description=Tut#6 Description, level=4, published=false, createdAt=2022-05-19 00:00:00.0]
    16. Tutorial [id=7, title=Spring Security, description=Tut#7 Description, level=5, published=false, createdAt=2022-05-19 00:00:00.0]
    17. */

    JPA BETWEEN查询

    春季数据JPA查询 日期/列之间:

    1. @Query("SELECT t FROM Tutorial t WHERE t.level BETWEEN ?1 AND ?2")
    2. List findByLevelBetween(int start, int end);
    3. @Query("SELECT t FROM Tutorial t WHERE t.createdAt BETWEEN ?1 AND ?2")
    4. List findByDateBetween(Date start, Date end);

    结果:

    1. tutorials = tutorialRepository.findByLevelBetween(3,5);
    2. show(tutorials);
    3. /*
    4. Tutorial [id=1, title=Spring Data, description=Tut#1 Description, level=3, published=true, createdAt=2022-03-11 00:00:00.0]
    5. Tutorial [id=3, title=Hibernate, description=Tut#3 Description, level=3, published=true, createdAt=2022-04-26 00:00:00.0]
    6. Tutorial [id=5, title=Spring Data JPA, description=Tut#5 Description, level=3, published=true, createdAt=2022-05-19 00:00:00.0]
    7. Tutorial [id=6, title=Spring Batch, description=Tut#6 Description, level=4, published=false, createdAt=2022-05-19 00:00:00.0]
    8. Tutorial [id=7, title=Spring Security, description=Tut#7 Description, level=5, published=false, createdAt=2022-05-19 00:00:00.0]
    9. */
    10. Date myDate1 = new SimpleDateFormat("yyyy-MM-dd").parse("2022-04-11");
    11. Date myDate2 = new SimpleDateFormat("yyyy-MM-dd").parse("2022-05-11");
    12. tutorials = tutorialRepository.findByDateBetween(myDate1, myDate2);
    13. show(tutorials);
    14. /*
    15. Tutorial [id=3, title=Hibernate, description=Tut#3 Description, level=3, published=true, createdAt=2022-04-26 00:00:00.0]
    16. Tutorial [id=4, title=Spring Boot, description=Tut#4 Description, level=2, published=false, createdAt=2022-04-26 00:00:00.0]
    17. */

    带参数的 JPA 查询示例

    在上面的例子中,我们使用位置参数:参数由它们在查询中的位置引用(定义后跟一个数字(?1,?2,...)。弹簧数据JPA将自动替换同一位置的每个参数的值。?

    绑定值的另一种方法是命名参数。命名参数以参数名称开头 (,, ...)。::title:date

    例如:

    1. @Query("SELECT t FROM Tutorial t WHERE t.published=:isPublished AND t.level BETWEEN :start AND :end")
    2. List findByLevelBetween(@Param("start") int start, @Param("end") int end, @Param("isPublished") boolean isPublished);

    结果:

    1. tutorials = tutorialRepository.findByLevelBetween(3, 5, true);
    2. show(tutorials);
    3. /*
    4. Tutorial [id=1, title=Spring Data, description=Tut#1 Description, level=3, published=true, createdAt=2022-03-11 00:00:00.0]
    5. Tutorial [id=3, title=Hibernate, description=Tut#3 Description, level=3, published=true, createdAt=2022-04-26 00:00:00.0]
    6. Tutorial [id=5, title=Spring Data JPA, description=Tut#5 Description, level=3, published=true, createdAt=2022-05-19 00:00:00.0]
    7. */

    JPA 查询Order By Desc/Asc

    Spring 数据 JPA 查询顺序按列进行筛选的示例:

    1. @Query("SELECT t FROM Tutorial t ORDER BY t.level DESC")
    2. List findAllOrderByLevelDesc();
    3. @Query("SELECT t FROM Tutorial t WHERE LOWER(t.title) LIKE LOWER(CONCAT('%', ?1,'%')) ORDER BY t.level ASC")
    4. List findByTitleOrderByLevelAsc(String title);
    5. @Query("SELECT t FROM Tutorial t WHERE t.published=true ORDER BY t.createdAt DESC")
    6. List findAllPublishedOrderByCreatedDesc();

    结果:

    1. tutorials = tutorialRepository.findAllOrderByLevelDesc();
    2. show(tutorials);
    3. /*
    4. Tutorial [id=7, title=Spring Security, description=Tut#7 Description, level=5, published=false, createdAt=2022-05-19 00:00:00.0]
    5. Tutorial [id=6, title=Spring Batch, description=Tut#6 Description, level=4, published=false, createdAt=2022-05-19 00:00:00.0]
    6. Tutorial [id=1, title=Spring Data, description=Tut#1 Description, level=3, published=true, createdAt=2022-03-11 00:00:00.0]
    7. Tutorial [id=3, title=Hibernate, description=Tut#3 Description, level=3, published=true, createdAt=2022-04-26 00:00:00.0]
    8. Tutorial [id=5, title=Spring Data JPA, description=Tut#5 Description, level=3, published=true, createdAt=2022-05-19 00:00:00.0]
    9. Tutorial [id=4, title=Spring Boot, description=Tut#4 Description, level=2, published=false, createdAt=2022-04-26 00:00:00.0]
    10. Tutorial [id=2, title=Java Spring, description=Tut#2 Description, level=1, published=false, createdAt=2022-03-11 00:00:00.0]
    11. */
    12. tutorials = tutorialRepository.findByTitleOrderByLevelAsc("at");
    13. show(tutorials);
    14. /*
    15. Tutorial [id=1, title=Spring Data, description=Tut#1 Description, level=3, published=true, createdAt=2022-03-11 00:00:00.0]
    16. Tutorial [id=3, title=Hibernate, description=Tut#3 Description, level=3, published=true, createdAt=2022-04-26 00:00:00.0]
    17. Tutorial [id=5, title=Spring Data JPA, description=Tut#5 Description, level=3, published=true, createdAt=2022-05-19 00:00:00.0]
    18. Tutorial [id=6, title=Spring Batch, description=Tut#6 Description, level=4, published=false, createdAt=2022-05-19 00:00:00.0]
    19. */
    20. tutorials = tutorialRepository.findAllPublishedOrderByCreatedDesc();
    21. show(tutorials);
    22. /*
    23. Tutorial [id=5, title=Spring Data JPA, description=Tut#5 Description, level=3, published=true, createdAt=2022-05-19 00:00:00.0]
    24. Tutorial [id=3, title=Hibernate, description=Tut#3 Description, level=3, published=true, createdAt=2022-04-26 00:00:00.0]
    25. Tutorial [id=1, title=Spring Data, description=Tut#1 Description, level=3, published=true, createdAt=2022-03-11 00:00:00.0]
    26. */

    JPA 查询Sort By

    使用带有过滤的Sort类的 Spring 数据 JPA 查询示例:

    1. @Query("SELECT t FROM Tutorial t WHERE LOWER(t.title) LIKE LOWER(CONCAT('%', ?1,'%'))")
    2. List findByTitleAndSort(String title, Sort sort);
    3. @Query("SELECT t FROM Tutorial t WHERE t.published=?1")
    4. List findByPublishedAndSort(boolean isPublished, Sort sort);

    结果:

    1. tutorials = tutorialRepository.findByTitleAndSort("at", Sort.by("level").descending());
    2. show(tutorials);
    3. /*
    4. Tutorial [id=6, title=Spring Batch, description=Tut#6 Description, level=4, published=false, createdAt=2022-05-19 00:00:00.0]
    5. Tutorial [id=1, title=Spring Data, description=Tut#1 Description, level=3, published=true, createdAt=2022-03-11 00:00:00.0]
    6. Tutorial [id=3, title=Hibernate, description=Tut#3 Description, level=3, published=true, createdAt=2022-04-26 00:00:00.0]
    7. Tutorial [id=5, title=Spring Data JPA, description=Tut#5 Description, level=3, published=true, createdAt=2022-05-19 00:00:00.0]
    8. */
    9. tutorials = tutorialRepository.findByTitleAndSort("at", Sort.by("createdAt").descending());
    10. show(tutorials);
    11. /*
    12. Tutorial [id=5, title=Spring Data JPA, description=Tut#5 Description, level=3, published=true, createdAt=2022-05-19 00:00:00.0]
    13. Tutorial [id=6, title=Spring Batch, description=Tut#6 Description, level=4, published=false, createdAt=2022-05-19 00:00:00.0]
    14. Tutorial [id=3, title=Hibernate, description=Tut#3 Description, level=3, published=true, createdAt=2022-04-26 00:00:00.0]
    15. Tutorial [id=1, title=Spring Data, description=Tut#1 Description, level=3, published=true, createdAt=2022-03-11 00:00:00.0]
    16. */
    17. tutorials = tutorialRepository.findByPublishedAndSort(false, Sort.by("level").descending());
    18. show(tutorials);
    19. /*
    20. Tutorial [id=7, title=Spring Security, description=Tut#7 Description, level=5, published=false, createdAt=2022-05-19 00:00:00.0]
    21. Tutorial [id=6, title=Spring Batch, description=Tut#6 Description, level=4, published=false, createdAt=2022-05-19 00:00:00.0]
    22. Tutorial [id=4, title=Spring Boot, description=Tut#4 Description, level=2, published=false, createdAt=2022-04-26 00:00:00.0]
    23. Tutorial [id=2, title=Java Spring, description=Tut#2 Description, level=1, published=false, createdAt=2022-03-11 00:00:00.0]
    24. */

    JPA 查询分页

    Spring Data JPA 查询示例使用Pageable类进行分页(具有排序和过滤):

    1. @Query("SELECT t FROM Tutorial t")
    2. Page findAllWithPagination(Pageable pageable);

    结果:

    1. int page = 0;
    2. int size = 3;
    3. Pageable pageable = PageRequest.of(page, size);
    4. tutorials = tutorialRepository.findAllWithPagination(pageable).getContent();
    5. show(tutorials);
    6. /*
    7. Tutorial [id=1, title=Spring Data, description=Tut#1 Description, level=3, published=true, createdAt=2022-03-11 00:00:00.0]
    8. Tutorial [id=2, title=Java Spring, description=Tut#2 Description, level=1, published=false, createdAt=2022-03-11 00:00:00.0]
    9. Tutorial [id=3, title=Hibernate, description=Tut#3 Description, level=3, published=true, createdAt=2022-04-26 00:00:00.0]
    10. */
    11. pageable = PageRequest.of(page, size, Sort.by("level").descending());
    12. tutorials = tutorialRepository.findAllWithPagination(pageable).getContent();
    13. show(tutorials);
    14. /*
    15. Tutorial [id=7, title=Spring Security, description=Tut#7 Description, level=5, published=false, createdAt=2022-05-19 00:00:00.0]
    16. Tutorial [id=6, title=Spring Batch, description=Tut#6 Description, level=4, published=false, createdAt=2022-05-19 00:00:00.0]
    17. Tutorial [id=5, title=Spring Data JPA, description=Tut#5 Description, level=3, published=true, createdAt=2022-05-19 00:00:00.0]
    18. */

    JPA 查询更新

    Spring 数据 JPA 查询,用于更新实体,同时使用:@Query@Transactional@Modifying

    1. @Transactional
    2. @Modifying
    3. @Query("UPDATE Tutorial t SET t.published=true WHERE t.id=?1")
    4. int publishTutorial(Long id);

    结果:

    1. tutorialRepository.deleteAll();
    2. Date date1 = new SimpleDateFormat("yyyy-MM-dd").parse("2022-03-11");
    3. Date date2 = new SimpleDateFormat("yyyy-MM-dd").parse("2022-04-26");
    4. Date date3 = new SimpleDateFormat("yyyy-MM-dd").parse("2022-05-19");
    5. tutorialRepository.save(new Tutorial("Spring Data", "Tut#1 Description", 3, false, date1));
    6. tutorialRepository.save(new Tutorial("Java Spring", "Tut#2 Description", 1, false, date1));
    7. tutorialRepository.save(new Tutorial("Hibernate", "Tut#3 Description", 3, false, date2));
    8. tutorialRepository.save(new Tutorial("Spring Boot", "Tut#4 Description", 2, false, date2));
    9. tutorialRepository.save(new Tutorial("Spring Data JPA", "Tut#5 Description", 3, false, date3));
    10. tutorialRepository.save(new Tutorial("Spring Batch", "Tut#6 Description", 4, false, date3));
    11. tutorialRepository.save(new Tutorial("Spring Security", "Tut#7 Description", 5, false, date3));
    12. List tutorials = new ArrayList<>();
    13. tutorials = tutorialRepository.findAll();
    14. show(tutorials); // published = false for all
    15. tutorialRepository.publishTutorial(tutorials.get(0).getId());
    16. tutorialRepository.publishTutorial(tutorials.get(2).getId());
    17. tutorialRepository.publishTutorial(tutorials.get(4).getId());
    18. tutorials = tutorialRepository.findByPublished(true);
    19. show(tutorials);
    20. /*
    21. Tutorial [id=1, title=Spring Data, description=Tut#1 Description, level=3, published=true, createdAt=2022-03-11 00:00:00.0]
    22. Tutorial [id=3, title=Hibernate, description=Tut#3 Description, level=3, published=true, createdAt=2022-04-26 00:00:00.0]
    23. Tutorial [id=5, title=Spring Data JPA, description=Tut#5 Description, level=3, published=true, createdAt=2022-05-19 00:00:00.0]
    24. */

    运行 Spring JPA 查询项目

    让我们打开,我们将在这里实现和自动连线接口来运行 JPA 查询方法。SpringBootQueryExampleApplication.javaCommandLineRunnerTutorialRepository

    1. package com.bezkoder.spring.query;
    2. // import ...
    3. @SpringBootApplication
    4. public class SpringBootQueryExampleApplication implements CommandLineRunner {
    5. @Autowired
    6. TutorialRepository tutorialRepository;
    7. public static void main(String[] args) {
    8. SpringApplication.run(SpringBootQueryExampleApplication.class, args);
    9. }
    10. @Override
    11. public void run(String... args) throws Exception {
    12. // call tutorialRepository methods here
    13. }
    14. private void show(List tutorials) {
    15. tutorials.forEach(System.out::println);
    16. }
    17. }

    结论

    今天我们已经知道如何使用 JPQL 在 Spring Boot 示例中使用 Spring JPA @Query注解进行自定义查询。

    您可以使用以下方法继续编写 CRUD Rest API:
    Spring Boot、Spring Data JPA – Rest CRUD API 示例

    如果要为 JPA 存储库编写单元测试:
    Spring 引导单元测试 带有 @DataJpaTest 的 JPA 存储库

    您还可以通过本教程了解:
    – 如何在 AWS 上部署此 Spring 启动应用程序(免费)。
    – dockerize withDocker Compose: Spring Boot and MySQL 示例
    – 通过这篇文章
    上传 Excel 文件并将数据存储在 MySQL 数据库中的方法– 通过这篇文章上传 CSV 文件并将数据存储在 MySQL 中。

    祝你学习愉快!再见。

    延伸阅读

    全栈 CRUD 应用程序:
    –Vue + 弹簧引导示例–角度 8 + 弹簧引导示例–角度 10 + 弹簧引导示例–角度 11 + 弹簧引导示例–角度 12 + 弹簧引导示例–角度 13 + 弹簧引导示例–角度 14 + 弹簧引导示例
    –反应 + 弹簧启动示例





     

    源代码

    您可以在Github 上找到本教程的完整源代码。

    改用本机查询:Spring JPA 本机查询示例与
    Spring 引导

    或派生查询:
    Spring Boot 中的 Spring JPA 派生查询示例

    或 EntityManager:
    Spring Boot 中的 JPA EntityManager 示例

    关联:
    JPA 在春季引导中使用休眠的一对一示例–使用休眠和春季引导的 JPA 一对多示例–JPA 多对多示例与春季引导

    中的休眠示例

    您可以在以下教程中应用此实现:
    –Spring JPA + H2 示例–Spring JPA + MySQL 示例–Spring JPA + PostgreSQL 示例–Spring JPA + Oracle 示例–Spring JPA + SQL Server 示例

  • 相关阅读:
    uniapp:动态修改页面标题
    Ansible--playbook 剧本
    ONLYOFFICE8.1版本桌面编辑器测评
    正则表达式 包含一些 但不包括 的命令
    【计算机网络】ICMP协议
    【网络安全】黑客自学笔记
    JAVA面向对象(OOP)总结----宏观的程序设计
    C++速通LeetCode简单第9题-二叉树的最大深度
    3个常用的损失函数
    springboot 使用shiro集成阿里云短信验证码
  • 原文地址:https://blog.csdn.net/allway2/article/details/128066866