Spring Data JPA 查询

简介: Spring Data的核心接口是Repository。我们来看一下最基本的CrudRepository 接口: public interface CrudRepository extends Repository { S save(S entity); ...

Spring Data的核心接口是Repository。我们来看一下最基本的CrudRepository 接口:

public interface CrudRepository<T, ID extends Serializable>
    extends Repository<T, ID> {

    <S extends T> S save(S entity); 

    T findOne(ID primaryKey);       

    Iterable<T> findAll();          

    Long count();                   

    void delete(T entity);          

    boolean exists(ID primaryKey);  

    // … 其他的省略
}

他们的作用显而易见,分别是保存、查找、全部、数量、删除和判断是否存在 。

 

其他的接口,比如JpaRepository 和MongoRepository 都是定向扩展了的,都继承自CrudRepository接口。还有一个 PagingAndSortingRepository接口增加了分页功能:

public interface PagingAndSortingRepository<T, ID extends Serializable>
  extends CrudRepository<T, ID> {

  Iterable<T> findAll(Sort sort);

  Page<T> findAll(Pageable pageable);
}

 如果想要访问第二页的10个,可以这样做:

PagingAndSortingRepository<User, Long> repository =  … 
Page<User> users = repository.findAll(new PageRequest(1, 10));

 注意参数的值。

 

要使用我们自己编写的Repository,需要在SPring中启动它:

 

import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@EnableJpaRepositories
class Config {}

 这里没有指定包名,所以根据类判断默认包。如果需要修改,可以传入参数:

@EnableJpaRepositories(basePackages={"com.pretty.awsome"})

 传入一个不需要使用大括号(也不用参数名),多个可以使用数组。

 

 然后获取实例:

public class SomeClient {

  @Autowired
  private MyRepository repository;
}

 

 

对于创建查询,Spring Data 使用了一个“约定”模式:使用By、And、Or、Distinct、IgnoreCase、OrderBy等。比如

 

public interface CityRepository extends Repository<City, Long> {

    Page<City> findAll(Pageable pageable);

    City findByNameAndStateAllIgnoringCase(String name, String state);
    
}

 我们定义了一个City实体,有两个属性: name 和state。对于方法findByNameAndStateAllIgnoringCase必需使用这样的名字,如果改成诸如

findByNameAndCountryAllIgnoringCase

 这样就会报错,说找不到country属性。

 

下面列一些模式:

public interface PersonRepository extends Repository<User, Long> {

  List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

  List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
  List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);

  List<Person> findByLastnameIgnoreCase(String lastname);
  List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);

  List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
  List<Person> findByLastnameOrderByFirstnameDesc(String lastname);

  List<Person> findByAddressZipCode(ZipCode zipCode);
}

 最下面一个是级联查询,返回的是满足x.address.zipCode==zipCode的Person List。算法会首先查询是否有addressZipCode属性,发现没有,于是从右边开始根据驼峰进行拆分(变成了addressZip和code)发现也没有,于是移动拆分点,匹配成功。(是不是很蛋疼?不过熟练的话真的很好啊)

好了我们继续往下走,好吧?等等,好像还有问题:如果Person真的有addressZip属性怎么办(我们的目的却没变,还是根据zipCode查找),他会说“天哪找不到code属性,你丫写错了肯定”。这时候可以(而且建议)使用下划线:

List<Person> findByAddress_ZipCode(ZipCode zipCode);

 所以我们在属性命名的时候要用驼峰而不是下划线。

 

现在我们使用limit查询,主演是First和Top:

User findFirstByOrderByLastnameAsc();

User findTopByOrderByAgeDesc();

Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);

Slice<User> findTop3ByLastname(String lastname, Pageable pageable);

List<User> findFirst10ByLastname(String lastname, Sort sort);

List<User> findTop10ByLastname(String lastname, Pageable pageable);

 是不是很神奇(Page和Slice的区别就像List和Iterator,所以量大的时候用Slice).

 

我正在学习中,对一些概念也不太了解。大家有新见解请留言,有疑问可以参考http://docs.spring.io/spring-data/data-commons/docs/1.11.0.RELEASE/reference/html/

目录
相关文章
|
1月前
|
NoSQL Java 数据库连接
《深入理解Spring》Spring Data——数据访问的统一抽象与极致简化
Spring Data通过Repository抽象和方法名派生查询,简化数据访问层开发,告别冗余CRUD代码。支持JPA、MongoDB、Redis等多种存储,统一编程模型,提升开发效率与架构灵活性,是Java开发者必备利器。(238字)
|
1月前
|
存储 Java 关系型数据库
Spring Boot中Spring Data JPA的常用注解
Spring Data JPA通过注解简化数据库操作,实现实体与表的映射。常用注解包括:`@Entity`、`@Table`定义表结构;`@Id`、`@GeneratedValue`配置主键策略;`@Column`、`@Transient`控制字段映射;`@OneToOne`、`@OneToMany`等处理关联关系;`@Enumerated`、`@NamedQuery`支持枚举与命名查询。合理使用可提升开发效率与代码可维护性。(238字)
289 1
存储 JSON Java
478 0
|
2月前
|
SQL Java 数据库连接
Spring Data JPA 技术深度解析与应用指南
本文档全面介绍 Spring Data JPA 的核心概念、技术原理和实际应用。作为 Spring 生态系统中数据访问层的关键组件,Spring Data JPA 极大简化了 Java 持久层开发。本文将深入探讨其架构设计、核心接口、查询派生机制、事务管理以及与 Spring 框架的集成方式,并通过实际示例展示如何高效地使用这一技术。本文档约1500字,适合有一定 Spring 和 JPA 基础的开发者阅读。
326 0
|
4月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
558 2
|
5月前
|
Java API 数据库
JPA简介:Spring Boot环境下的实践指南
上述内容仅是JPA在Spring Boot环境下使用的冰山一角,实际的实践中你会发现更深更广的应用。总而言之,只要掌握了JPA的规则,你就可以借助Spring Boot无比丰富的功能,娴熟地驾驶这台高性能的跑车,在属于你的程序世界里驰骋。
219 15
|
5月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
235 1
|
6月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
237 32
|
7月前
|
NoSQL 安全 Java
深入理解 RedisConnectionFactory:Spring Data Redis 的核心组件
在 Spring Data Redis 中,`RedisConnectionFactory` 是核心组件,负责创建和管理与 Redis 的连接。它支持单机、集群及哨兵等多种模式,为上层组件(如 `RedisTemplate`)提供连接抽象。Spring 提供了 Lettuce 和 Jedis 两种主要实现,其中 Lettuce 因其线程安全和高性能特性被广泛推荐。通过手动配置或 Spring Boot 自动化配置,开发者可轻松集成 Redis,提升应用性能与扩展性。本文深入解析其作用、实现方式及常见问题解决方法,助你高效使用 Redis。
783 4
|
7月前
|
SQL Java 编译器
深入理解 Spring Data JPA 的导入与使用:以 UserRepository为例
本文深入解析了 Spring Data JPA 中 `UserRepository` 的导入与使用。通过示例代码,详细说明了为何需要导入 `User` 实体类、`JpaRepository` 接口及 `@Repository` 注解。这些导入语句分别用于定义操作实体、提供数据库交互方法和标识数据访问组件。文章还探讨了未导入时的编译问题,并展示了实际应用场景,如用户保存、查询与删除操作。合理使用导入语句,可让代码更简洁高效,充分发挥 Spring Data JPA 的优势。
459 0

热门文章

最新文章

下一篇
oss云网关配置