【问题标题】:In which cases does JpaRepository automatically create the query without you having to use @Query annotation在哪些情况下,JpaRepository 会自动创建查询,而无需使用 @Query 注释
【发布时间】:2021-07-22 07:16:17
【问题描述】:

我正在学习 Spring boot 中的 Udemy 教程。有一部分@Query 没有用于存储库界面中的用户创建的方法。它有效,但我想了解何时 JpaRepository 负责创建查询。在下面的 User 类中,@Table 没有被使用。

findByEmail(String email) 方法无需任何实现/定义即可工作。所以,我的印象是,JpaRepository 自动创建了Select from User where email = emailargument

这就是我所拥有的

一个名为reservation 的数据库与表User

application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/reservation
spring.datasource.username=root

User.java

import javax.persistence.Entity;

@Entity
public class User extends AbstractEntity{

    
    private String firstName;
    private String lastName;
    private String email;
    private String password;
    
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

UserRepository.java

import org.springframework.data.jpa.repository.JpaRepository;

import com.project.flightreservation.entities.User;

public interface UserRepository extends JpaRepository<User, Long> {

User findByEmail(String email);

}

【问题讨论】:

标签: java spring-boot spring-data-jpa


【解决方案1】:

当 Spring Data 创建一个新的 Repository 实现时,它会分析接口定义的所有方法,并尝试从方法名称自动生成查询。虽然这有一些限制,但它是一种非常强大且优雅的方式,可以轻松定义新的自定义访问方法。 Ref

通过实现 Repository 接口之一,DAO 将已经定义和实现了一些基本的 CRUD 方法(和查询)。

您可以使用这种方法创建更复杂的查询reference 您发布的问题称为自动自定义查询。

【讨论】:

  • 谢谢。现在这是有道理的。
【解决方案2】:

JPA 能够以不同的方式构造查询。您可以使用从 methodName 派生的查询与谓词 IsStartingWithStartingWithStartsWithIsEndingWithEndingWithEndsWithIsNotContainingNotContainingIsContaining、@98765 ContainingContains 这些查询的相应参数将被清理。

如果您遇到方法名称解析器不支持您要使用的关键字或方法名称会变得不必要的丑陋的情况,您可以使用@QuerynamedQuery 支持JPQL 或@ 987654337@.

我强烈建议你通过这个documentation

【讨论】:

    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2022-11-15
    • 2021-07-11
    • 1970-01-01
    • 2023-04-02
    • 2021-04-28
    相关资源
    最近更新 更多