Spring Data JPA 之Repository 接口相关

Repository 接口是 Spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法。

引自尚硅谷Spring Datappt文件。

Repository接口定义如下:
Repository<T, ID extends Serializable>

Spring Data可以让我们只定义接口,只要遵循 Spring Data的规范,就无需写实现类。

与继承 Repository接口 等价的一种方式,就是在持久层接口上使用 @RepositoryDefinition 注解,并为其指定 domainClassidClas 属性。如下两种方式是完全等价的

即spring Data 提供两种方式来声明Repository

  • 继承Repository接口[org.springframework.data.repository.Repository包下]。
  • 在目标Dao上添加注解@RepositoryDefinition并给该注解添加domainClassidClas属性的值。
基础的 Repository 提供了最基本的数据访问功能,其几个子接口则扩展了一些功能。它们的继承关系如下: 
Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类
CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法 
PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法 
JpaRepository: 继承 PagingAndSortingRepository,实现一组 JPA 规范相关的方法 
自定义的 XxxxRepository 需要继承 JpaRepository,这样的 XxxxRepository 接口就具备了通用的数据访问控制层的能力。
JpaSpecificationExecutor: 不属于Repository体系,实现一组 JPA Criteria 查询相关的方法

---------引自尚硅谷PPT
Spring Data JPA 查询规范

按照 Spring Data 的规范,查询方法以 findBy | readBy | getBy 开头

//例如:定义一个 Entity 实体类
class User{ 
    private String firstName; 
    private String lastName; 
} 

//使用And条件连接时,应这样写: 
findByLastNameAndFirstName(String lastName,String firstName); 
//条件的属性名称与个数要与参数的位置与个数一一对应 

直接在接口中定义查询方法,如果是符合规范的,可以不用写实现,目前支持的关键字写法如下:

关键字简单示例JPQL片段示例
ANDfindByLastNameAndFirstNameWHERE Entity.lastName = ?1 AND Entity.firstName = ?2
ORreadByLastNameOrFirstNameWHERE Entity.lastName = ?1 OR Entity.firstName = ?2
BetweengetByStartDateBetweenWHERE Entity.startDate BETWEEN ?1 AND ?2
LessThanfindByAgeLessThanWHERE Entity.age < ?1
GreaterThanreadByAgeGreaterThanWHERE Entity.age > ?1
After只作用在时间findByStartDateAfterWHERE Entity.startDate > ?1
Before只作用在时间findByStartDateBeforeWHERE Entity.startDate < ?1
LessThanEqualfindByAgeLessThenEqualWHERE Entity.age <= ?1
GreaterThanEqualreadByAgeGreaterThenEqualWHERE Entity.age >= ?1
IsfindByLastNameIsWHERE Entity.lastName = ?1
EqualgetByFirstNameEqualWHERE Entity.firstName = ?1
IsNullfindByAddressIsNullWHERE Entity.address is NULL
IsNotNullreadByAddressIsNotNullWHERE Entity.address NOT NULL
NotNullreadByAddressNotNullWHERE Entity.address NOT NULL
LikefindByNameLikeWHERE Entity.name LIKE ? 不包括'%'符号
Not LikefindByNameNotLikeWHERE Entity.name not like ?1 不包括'%'符号
StartingWithreadByNameStartingWithWHERE Entity.name like ‘?1%’条件以'%'符号结尾
EndingWithreadByName EndingWithWHERE Entity.name like ‘%?1’条件以'%'符号开头
ContaininggetByNameContainingWHERE Entity.name like ‘%?1%’ 包含'%'符号
OrderByfindByAgeOrderByAddressDescWHERE Entity.age = ? Order By Entity.address DESC
NotreadByAgeNotWHERE Entity.age <> ?1 不等于
InfindByNameIn(Collection name)WHERE Entity.name IN (?1 ,?2, ?3)
NotIngetByNameNotIn(Collection name)WHERE Entity.name NOT IN (?1 ,?2, ?3)
TruereadByFloagTrue()WHERE Entity.floag = true
FalsereadByFloagFalse()WHERE Entity.floag = false
IgnoreCasefindByNameIgnoreCaseWHERE UPPER(Entity.Name) = UPPER(?1)

以下引自尚硅谷PPT文档:

假如创建如下的查询:findByUserDepUuid(),框架在解析该方法时,首先剔除 findBy,然后对剩下的属性进行解析,假设查询实体为Doc

  • 先判断 userDepUuid (根据 POJO 规范,首字母变为小写)是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;

  • 从右往左截取第一个大写字母开头的字符串(此处为Uuid),然后检查剩下的字符串是否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,则重复第二步,继续从右往左截取;最后假设 user 为查询实体的一个属性;

  • 接着处理剩下部分(DepUuid),先判断 user 所对应的类型是否有depUuid属性,如果有,则表示该方法最终是根据 “ Doc.user.depUuid” 的取值进行查询;否则继续按照步骤 2 的规则从右往左截取,最终表示根据 “Doc.user.dep.uuid” 的值进行查询。

  • 可能会存在一种特殊情况,比如 Doc包含一个 user 的属性,也有一个 userDep 属性,此时会存在混淆。可以明确在属性之间加上 “_” 以显式表达意图,比如 “findByUser_DepUuid()” 或者 “findByUserDep_uuid()”

  • 特殊的参数: 还可以直接在方法的参数上加入分页或排序的参数,比如:
    Page findByName(String name, Pageable pageable);
    List findByName(String name, Sort sort);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好,感谢您的提问。创建一个 Spring Data JPARepository 接口非常简单,只需要按照以下步骤操作即可: 1. 创建一个继承自 `JpaRepository` 的接口,指定实体类和主键类型: ``` public interface UserRepository extends JpaRepository<User, Long> { } ``` 其中,`User` 是您的实体类,`Long` 是实体类的主键类型。`JpaRepository` 是 Spring Data JPA 提供的一个基础 Repository 接口,提供了一些基本的数据操作方法,如插入、删除、更新、查询等。 2. 在您的实体类上添加注解,指定表名和主键: ``` @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; // 省略 getter 和 setter 方法 } ``` 在上述代码中,`@Entity` 注解表示该类是一个 JPA 实体类,`@Table(name = "user")` 指定该实体类对应的数据库表名为 `user`,`@Id` 和 `@GeneratedValue` 注解指定实体类的主键。 3. 在您的 Spring Boot 应用程序中,使用 `@EnableJpaRepositories` 注解启用 Spring Data JPA,并指定 Repository 接口路径: ``` @SpringBootApplication @EnableJpaRepositories(basePackages = "com.example.repository") public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 在上述代码中,`@EnableJpaRepositories` 注解用于启用 Spring Data JPA,`basePackages` 属性指定 Repository 接口路径。 4. 在您的服务层或控制器中注入 Repository 接口,即可使用 Spring Data JPA 提供的基本数据操作方法: ``` @RestController public class UserController { @Autowired private UserRepository userRepository; @GetMapping("/users") public List<User> getAllUsers() { return userRepository.findAll(); } } ``` 在上述代码中,`@Autowired` 注解用于自动注入 `UserRepository` 对象,然后在 `getAllUsers` 方法中调用 `findAll` 方法获取所有用户信息。 通过上述步骤创建一个 Spring Data JPARepository 接口非常简单,希望能够帮助到您。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值