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/
相关推荐
9. **JPA Querydsl Support**:Spring Data JPA 还支持 Querydsl,这是一个强大的类型安全的查询语言,它可以进一步提高查询的可读性和可维护性。 10. **Elasticsearch 集成**:虽然不是 Spring Data JPA 的核心...
Spring Data JPA API。 Spring Data JPA 开发文档。 官网 Spring Data JPA API。
例如,Spring Data JPA支持自动化的查询生成,只需定义Repository接口,无需编写任何实现代码,就可以执行CRUD(创建、读取、更新、删除)操作。此外,它还支持复杂的查询方法命名,如findByXXX,根据方法名自动构建...
Spring Data JPA提供了强大的Repository抽象,允许开发者以声明式的方式定义数据操作,如查询方法。只需要在接口上定义方法名,Spring Data JPA就能自动生成对应的SQL语句。例如,`findAll()`会执行SELECT ALL查询,...
3. **Spring Data JPA概述**:Spring Data JPA是Spring对JPA的扩展,它提供了自动化的数据访问层,包括查询方法的自动实现、Repository接口的定义以及定制化查询等功能。 4. **Repository接口**:Spring Data JPA的...
- Spring Data JPA虽然简化了查询编写,但可能导致生成的SQL不够优化,尤其是在处理大数据量或复杂查询时。开发者需要熟悉JPA的内部工作原理,适时使用`@Query`注解自定义SQL,以提升性能。 2. **关联关系的处理**...
本教程将详细介绍 Spring Data JPA 的核心概念与使用方法,帮助开发者从基础入门到实现复杂查询的完整过程。 第一章:Spring Data JPA 入门 Spring Data JPA 简化了 JPA(Java Persistence API)的开发,通过约定...
此外,Spring Data JPA还支持自定义查询,允许开发者使用@Query注解编写JPQL语句。 Hibernate作为JPA的实现,是一个强大的对象关系映射(ORM)框架。它将Java对象与数据库表进行映射,使得开发者可以通过操作对象来...
- **强大的查询支持**:除了简单的 CRUD 方法,Spring Data JPA 还支持基于方法名的复杂查询,甚至可以使用 JPA Querydsl 或 Specification 进行更复杂的查询。 - **事务管理**:Spring Data JPA 结合 Spring 的事务...
4. **查询方法命名**:Spring Data JPA支持根据方法名自动生成SQL查询,如`findByFirstName(String firstName)`,会对应生成查找firstName等于指定值的查询。 5. **自定义查询**:当默认的命名查询不满足需求时,...
如果默认的CRUD方法不能满足需求,可以通过在Repository 接口中定义查询方法,Spring Data JPA 会根据方法名自动构建SQL。例如,`findByEmail` 方法会生成一个查找指定邮箱用户的查询。 6. **Service 层** 在业务...
通过定义简单的接口,Spring Data JPA可以自动生成对应的查询,包括CRUD操作以及复杂的聚合查询。 **Spring Boot与Spring Data JPA的结合** 在Spring Boot框架中,Spring Data JPA的集成变得更加简单。Spring Boot...
SpringDataJPA是Spring框架中用于简化数据持久层操作的一个模块,它基于Java持久层API(Java Persistence API,JPA)标准。在实际的项目开发中,SpringDataJPA能够极大程度上减少我们对于数据访问层代码的编写工作。...
在本项目"Spring Data JPA入门项目02"中,我们将深入探讨如何使用Spring Data JPA进行查询操作,包括排序和分页。Spring Data JPA是Spring Framework的一个模块,它为Java Persistence API (JPA) 提供了一种更加便捷...
**SpringBoot整合SpringData JPA** 是一个现代Java开发中的常见技术栈,它结合了Spring Boot的便捷性和Spring Data JPA的数据访问效率。Spring Boot简化了应用的初始搭建以及配置,而Spring Data JPA则是Spring ...
2. **Query 方法**:在Repository接口中,可以定义方法名,Spring Data JPA会根据方法名自动构造对应的JPA查询。例如,`findAll()`对应于SQL的`SELECT * FROM table`,`findByUsername(String username)`对应于`...
在实际项目中,你可能需要处理更复杂的查询,如分页、排序、聚合等,Spring Data JPA 都能提供相应的支持。同时,通过自定义查询方法,你可以轻松扩展功能,而无需编写繁琐的 SQL 语句。 **标签解析:** - **源码**...
【标题】"spring data jpa + spring + json demo"揭示了这个项目是关于使用Spring Data JPA、Spring框架以及JSON处理的一个示例应用。Spring Data JPA是Spring框架的一个模块,它简化了JPA(Java Persistence API)...