`
somefuture
  • 浏览: 1087428 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring Data JPA 查询

 
阅读更多

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
1
分享到:
评论
3 楼 spiniper 2015-12-17  
我用的比较传统的方法,就是写一个supportDao的类,把基本的正删改查和分页都写在里面,尽量高度抽象,一般的对数据库的访问都只有这些,所以不需要重复写那么多无用的dao类,只有碰到特殊情况,例如存储过程或者函数的调用什么的。
复杂的业务逻辑根据情况写在需要service里面,简单crud也用一个公用的service去处理即可。
这样开发者只需要重点的去专注页面和ctrl的数据交互即可,而不要一直去做service和dao层的工作。
2 楼 somefuture 2015-11-03  
spiniper 写道
说实话,spring-data并不是很好用,我不喜欢碰到一个功能都要建个dao service什么的,而且做扩展还比较烦。

你有没有推荐的做法?
1 楼 spiniper 2015-11-03  
说实话,spring-data并不是很好用,我不喜欢碰到一个功能都要建个dao service什么的,而且做扩展还比较烦。

相关推荐

    Spring Data JPA中文文档[1.4.3]_springdatajpa_erlang_waitxpf_

    9. **JPA Querydsl Support**:Spring Data JPA 还支持 Querydsl,这是一个强大的类型安全的查询语言,它可以进一步提高查询的可读性和可维护性。 10. **Elasticsearch 集成**:虽然不是 Spring Data JPA 的核心...

    Spring Data JPA API(Spring Data JPA 开发文档).CHM

    Spring Data JPA API。 Spring Data JPA 开发文档。 官网 Spring Data JPA API。

    Spring Data JPA 笔记

    例如,Spring Data JPA支持自动化的查询生成,只需定义Repository接口,无需编写任何实现代码,就可以执行CRUD(创建、读取、更新、删除)操作。此外,它还支持复杂的查询方法命名,如findByXXX,根据方法名自动构建...

    spring注解+spring data jpa文档+JPA文档.rar

    Spring Data JPA提供了强大的Repository抽象,允许开发者以声明式的方式定义数据操作,如查询方法。只需要在接口上定义方法名,Spring Data JPA就能自动生成对应的SQL语句。例如,`findAll()`会执行SELECT ALL查询,...

    Spring Data JPA的优点和难点.pdf

    - Spring Data JPA虽然简化了查询编写,但可能导致生成的SQL不够优化,尤其是在处理大数据量或复杂查询时。开发者需要熟悉JPA的内部工作原理,适时使用`@Query`注解自定义SQL,以提升性能。 2. **关联关系的处理**...

    Spring Data JPA从入门到精通

    'SpringDataJPA从入门到精通'分为12章 内容包括整体认识JPA、JPA基础查询方法、定义查询方法、注解式查询方法、@Entity实例里面常用注解详解、JpaRepository扩展详解、JPA的MVC扩展REST支持、DataSource的配置、乐观...

    spring data jpa 教程

    本教程将详细介绍 Spring Data JPA 的核心概念与使用方法,帮助开发者从基础入门到实现复杂查询的完整过程。 第一章:Spring Data JPA 入门 Spring Data JPA 简化了 JPA(Java Persistence API)的开发,通过约定...

    手动创建 SpringMvc +SpringDataJpa+Hibernate+ freemarker mavenProject+ 环境切换 webDemo

    此外,Spring Data JPA还支持自定义查询,允许开发者使用@Query注解编写JPQL语句。 Hibernate作为JPA的实现,是一个强大的对象关系映射(ORM)框架。它将Java对象与数据库表进行映射,使得开发者可以通过操作对象来...

    Spring Data JPA.zip

    - **强大的查询支持**:除了简单的 CRUD 方法,Spring Data JPA 还支持基于方法名的复杂查询,甚至可以使用 JPA Querydsl 或 Specification 进行更复杂的查询。 - **事务管理**:Spring Data JPA 结合 Spring 的事务...

    Spring Data JPA中文文档[1.4.3].zip

    4. **查询方法命名**:Spring Data JPA支持根据方法名自动生成SQL查询,如`findByFirstName(String firstName)`,会对应生成查找firstName等于指定值的查询。 5. **自定义查询**:当默认的命名查询不满足需求时,...

    Spring Data JPA Demo

    如果默认的CRUD方法不能满足需求,可以通过在Repository 接口中定义查询方法,Spring Data JPA 会根据方法名自动构建SQL。例如,`findByEmail` 方法会生成一个查找指定邮箱用户的查询。 6. **Service 层** 在业务...

    其实spring data jpa比mybatis更好用.zip_JPA mybatis

    通过定义简单的接口,Spring Data JPA可以自动生成对应的查询,包括CRUD操作以及复杂的聚合查询。 **Spring Boot与Spring Data JPA的结合** 在Spring Boot框架中,Spring Data JPA的集成变得更加简单。Spring Boot...

    springdatajpa.pdf

    SpringDataJPA是Spring框架中用于简化数据持久层操作的一个模块,它基于Java持久层API(Java Persistence API,JPA)标准。在实际的项目开发中,SpringDataJPA能够极大程度上减少我们对于数据访问层代码的编写工作。...

    Spring Data JPA入门项目02

    在本项目"Spring Data JPA入门项目02"中,我们将深入探讨如何使用Spring Data JPA进行查询操作,包括排序和分页。Spring Data JPA是Spring Framework的一个模块,它为Java Persistence API (JPA) 提供了一种更加便捷...

    springBoot整合springData JPA

    **SpringBoot整合SpringData JPA** 是一个现代Java开发中的常见技术栈,它结合了Spring Boot的便捷性和Spring Data JPA的数据访问效率。Spring Boot简化了应用的初始搭建以及配置,而Spring Data JPA则是Spring ...

    spring学习:spring data jpa

    2. **Query 方法**:在Repository接口中,可以定义方法名,Spring Data JPA会根据方法名自动构造对应的JPA查询。例如,`findAll()`对应于SQL的`SELECT * FROM table`,`findByUsername(String username)`对应于`...

    spring data jpa简单案例

    在实际项目中,你可能需要处理更复杂的查询,如分页、排序、聚合等,Spring Data JPA 都能提供相应的支持。同时,通过自定义查询方法,你可以轻松扩展功能,而无需编写繁琐的 SQL 语句。 **标签解析:** - **源码**...

    spring data jpa + spring + json demo

    【标题】"spring data jpa + spring + json demo"揭示了这个项目是关于使用Spring Data JPA、Spring框架以及JSON处理的一个示例应用。Spring Data JPA是Spring框架的一个模块,它简化了JPA(Java Persistence API)...

Global site tag (gtag.js) - Google Analytics