Spring Data JPA 查询

转载 2015年11月17日 18:04:34




博客分类:

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

Java代码  收藏代码
  1. public interface CrudRepository<T, ID extends Serializable>  
  2.     extends Repository<T, ID> {  
  3.   
  4.     <S extends T> S save(S entity);   
  5.   
  6.     T findOne(ID primaryKey);         
  7.   
  8.     Iterable<T> findAll();            
  9.   
  10.     Long count();                     
  11.   
  12.     void delete(T entity);            
  13.   
  14.     boolean exists(ID primaryKey);    
  15.   
  16.     // … 其他的省略  
  17. }  

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

 

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

伦理片 http://www.dotdy.com/

Java代码  收藏代码
  1. public interface PagingAndSortingRepository<T, ID extends Serializable>  
  2.   extends CrudRepository<T, ID> {  
  3.   
  4.   Iterable<T> findAll(Sort sort);  
  5.   
  6.   Page<T> findAll(Pageable pageable);  
  7. }  

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

Java代码  收藏代码
  1. PagingAndSortingRepository<User, Long> repository =  …   
  2. Page<User> users = repository.findAll(new PageRequest(110));  

 注意参数的值。

 

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

 

Java代码  收藏代码
  1. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;  
  2.   
  3. @EnableJpaRepositories  
  4. class Config {}  

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

Java代码  收藏代码
  1. @EnableJpaRepositories(basePackages={"com.pretty.awsome"})  

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

 

 然后获取实例:

Java代码  收藏代码
  1. public class SomeClient {  
  2.   
  3.   @Autowired  
  4.   private MyRepository repository;  
  5. }  

 

 

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

 

Java代码  收藏代码
  1. public interface CityRepository extends Repository<City, Long> {  
  2.   
  3.     Page<City> findAll(Pageable pageable);  
  4.   
  5.     City findByNameAndStateAllIgnoringCase(String name, String state);  
  6.       
  7. }  

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

Java代码  收藏代码
  1. findByNameAndCountryAllIgnoringCase  

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

 

下面列一些模式:

Java代码  收藏代码
  1. public interface PersonRepository extends Repository<User, Long> {  
  2.   
  3.   List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);  
  4.   
  5.   List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);  
  6.   List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);  
  7.   
  8.   List<Person> findByLastnameIgnoreCase(String lastname);  
  9.   List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);  
  10.   
  11.   List<Person> findByLastnameOrderByFirstnameAsc(String lastname);  
  12.   List<Person> findByLastnameOrderByFirstnameDesc(String lastname);  
  13.   
  14.   List<Person> findByAddressZipCode(ZipCode zipCode);  
  15. }  

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

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

Java代码  收藏代码
  1. List<Person> findByAddress_ZipCode(ZipCode zipCode);  

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

 

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


影音先锋电影 http://www.iskdy.com/

Java代码  收藏代码
  1. User findFirstByOrderByLastnameAsc();  
  2.   
  3. User findTopByOrderByAgeDesc();  
  4.   
  5. Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);  
  6.   
  7. Slice<User> findTop3ByLastname(String lastname, Pageable pageable);  
  8.   
  9. List<User> findFirst10ByLastname(String lastname, Sort sort);  
  10.   
  11. List<User> findTop10ByLastname(String lastname, Pageable pageable);  

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

 

我正在学习中,对一些概念也不太了解。大家有新见解请留言,有疑问可以参考

jpa Query查询,时间查询,in查询(Spring Data Jpa 3)

记录下原来用的jpa Query查询; 解决问题:使用Query从entry查询数据填充到DTO;先看entry:package com.test.entity;@Entity @Data publi...
  • WANTAWAY314
  • WANTAWAY314
  • 2016年10月20日 14:40
  • 45874

一步一步学SpringDataJpa——JpaRepository查询功能

1.JpaRepository支持接口规范方法名查询。意思是如果在接口中定义的查询方法符合它的命名规则,就可以不用写实现,目前支持的关键字如下。 Keyword Sample J...
  • ming070423
  • ming070423
  • 2014年03月25日 18:47
  • 35047

Spring Data JPA中的动态查询

Spring Data JPA大大的简化了我们持久层的开发,但是实际应用中,我们还是需要动态查询的。 比如,前端有多个条件,这些条件很多都是可选的,那么后端的SQL,就应该是可以定制的,在使用...
  • anxpp
  • anxpp
  • 2016年09月06日 20:05
  • 13799

Spring Data Jpa自定义sql查询返回

1.最近用到Spring Data Jpa虽然简化了数据层的开发,提升了效率,但是面对业务复杂时,多表关联很复杂,不能满足需要,因此自己写了一个dao实现,通过传统的sql,返回自    定义的对象。...
  • lingyun870801
  • lingyun870801
  • 2015年01月25日 00:54
  • 14946

转载 spring-data-jpa 介绍 复杂查询,包括多表关联,分页,排序等

本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求。这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring...
  • mendeliangyang
  • mendeliangyang
  • 2016年08月30日 10:04
  • 23224

spring data jpa 创建方法名进行简单查询

spring data jpa 可以通过在接口中按照规定语法创建一个方法进行查询,spring data jpa 基础接口中,如CrudRepository中findOne,save,delete等,...
  • yingxiake
  • yingxiake
  • 2016年03月28日 22:07
  • 9910

SpringDataJPA学习记录(三)--复杂查询的封装

SpringDataJPA学习记录(三)–复杂查询的封装标签(空格分隔): springJPA1.使用CriteriaBuilder构建JPQL在UserRepositoryImpl中使用Criter...
  • u012706811
  • u012706811
  • 2016年11月18日 16:13
  • 9556

spring data jpa 多表多条件查询

spring data jpa 多表多条件查询
  • quwenzhe
  • quwenzhe
  • 2017年01月24日 09:32
  • 11861

Spring Data JPA 系列 —— 两张表(多对多关联)

这里通过一个完整的例子展示如何通过 JPA 对两张表(多对多关联)进行增删改查操作。...
  • lewis_007
  • lewis_007
  • 2016年11月02日 11:46
  • 14084

Spring Data JPA 实战(一)-体系结构及基本配置

Spring Data JPA原理与应用(一) 一.Spring DataJPA介绍 使用Spring Data Repository将程序员从大量重复繁杂的数据库层操作中解放啊出来。 二.Repos...
  • sunhuiliang85
  • sunhuiliang85
  • 2017年03月05日 23:29
  • 438
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring Data JPA 查询
举报原因:
原因补充:

(最多只允许输入30个字)