`
wujng68
  • 浏览: 10212 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Spring Data Jpa 参考文档(一)

阅读更多

1.使用spring data repositorys
          

        spring data repository abstraction节省了大量的数据访问层实现持久化的代码。
    

        1.1核心概念

 

         Repository是核心接口,接口需要实体类型和实体类id的类型参数。CrudRepository接口继承Repository接口,并提供了对实体类的CRUD功能。实例如下:

 

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);
                                                                                         
    // … more functionality omitted.
}

 PagingAndSortingRepository接口继承了CrudRepository接口,提供了对实体的分页功能。代码如下:

 

 

public interface PagingAndSortingRepository<T, ID extends Serializable> 
  extends CrudRepository<T, ID> {
  Iterable<T> findAll(Sort sort);
  Page<T> findAll(Pageable pageable);
}

 分页实现代码如下:

 

 

PagingAndSortingRepository<User, Long> repository = // … get access to a bean
Page<User> users = repository.findAll(new PageRequest(1, 20));

 

 

         1.2 查询方法

 

          spring data 完成一个查询需要以下4个过程:

          (1)建一个继承Repository或Repository的子类的一个接口,并绑定实体类。

 

public interface PersonRepository extends Repository<User, Long> { … }

          (2)在接口中定义查询方法。

 

 

List<Person> findByLastname(String lastname);

          (3)在sping配置文件中创建接口的代理实例。

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://www.springframework.org/schema/data/jpa"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/data/jpa
    http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
  <repositories base-package="com.acme.repositories" />
</beans>

          (4)获得接口实例并执行查询方法。

 

 

public class SomeClient {
  @Autowired
  private PersonRepository repository;
  public void doSomething() {
    List<Person> persons = repository.findByLastname("Matthews");
  }
}

    以下是对4个过程的说明:

 

   定义接口

   第一步定义一个指定实体类的接口,这个接口必须继承Repository,并且要输入实体类和ID类型。如果要提供实体的CRUD操作,那么可以用CrudRepository替代Repository接口。

 

    通常,定义的repository接口都继承Repository,  CrudRepository  or PagingAndSortingRepository接口。有时如果不想继承这些spring data接口,那么也可以给接口注解@RepositoryDefinition来实现。继承CrudRepository 会包含对实体的完整管理操作,如果只想选择性的提供某些方法,那么可以在CrudRepository接口中拷贝想要提供的操作方法放到定义的接口中。

 

interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> {
  T findOne(ID id);
  T save(T entity);
}
interface UserRepository extends MyBaseRepository<User, Long> {
  User findByEmailAddress(EmailAddress emailAddress);
}

 在这第一步为实体类定义了一个基本接口,并且提供了findOne(…) 和 save(…)方法,这些方法会通过匹配CrudRepository接口的签名方法并传递到实现类中。因此,接口UserRepository将包含保存用户、通用id得到唯一用户和通过邮件地址查询用户的功能实现。

 

  定义查询方法

  Repository代理能够通过方法名来生成查询语句。它可以直接通过方法名生成,也可以利用策略构建查询语句。

     在命名空间中通过query-lookup-strategy属性来配置策略。有些策略在特殊的存储环境下不支持。

    CREAT  —— create是根据接口方法名来构建查询语句,方法是首先删掉一些固定的常用的前缀,然后在解析剩下的部分。

    USE_DECLARED_QUERY——它会查找已经定义的查询语句,如果没发现会抛出异常。这个查询语句是通过某处的注解或其他方法定义的。根据指定的规范文档来查找可用选项,如果在方法被调用时没有找到定义的查询,那么会出现错误。

    CREATE_IF_NOT_FOUND (default)——CREATE_IF_NOT_FOUND 结合了 CREATE 和USE_DECLARED_QUERY。首先查找已定义的查询,如果没有找到,会创建一个基于方法名称的查询。这个策略是默认的,如果没有设置的话它将起作用。

    Query的创建

    spring data 的query构建机制对实体的查询非常有用,它会去掉方法名中的find…By、read…By和 get…By 前缀,然后再解析剩余的部分。方法名中可以加入distinct来表明创建的查询语句需要distinct约束,方法名中的第一个by是查询语句的开始,也可以定义属性的查询条件,并且可以使用and和or来连接多个条件。

public interface PersonRepository extends Repository<User, Long> {
  List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);
  // 查询中可带distinct标识
  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);
  // 带order by排序的查询语句
  List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
  List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}

 方法名解析的结果是与持久化储存相关的,但是,还要注意以下几个问题:

  • 在多个属性组根据合查询条件时,可以使用and和or连接。另外,还支持Between、LessThan、GreaterThan、Like这样的运算符。这些运算的使用取决于数据库,因此要参考相关文档。
  • 方法名的解析支持为各个属性设置IgnoreCase,例如,findByLastnameIgnoreCase(…)或者findByLastnameAndFirstnameAllIgnoreCase(…)。但是,IgnoreCase也可能跟数据库有关系,需要参考相关的文档。
  • 在方法名中直接指定order by (desc、asc)来支持排序,另外还支持动态排序,见参数绑定一节。

    属性表达式

   前面的例子,属性的表达式都是引用了实体本身的属性。当然,还可以引用属性嵌套的属性。例如,Persons类有一个属性Addresses,Addresses里包含一个ZipCodes.属性,那么方法名应该是这样

 

List<Person> findByAddressZipCode(ZipCode zipCode);

 创建属性的遍历如同x.address.zipCode。解析算法是首先取出作为实体属性的完整部分(AddressZipCode),检查这部分是否是实体类的属性,如果是那么解析成功,否则,将这个部分按照驼峰式从右往左分割为两部分(头和尾),将分割的两部分跟实体属性进行匹配,如:AddressZipCode分为AddressZip 和 Code。如果解析器在属性中匹配了去掉尾的头,那么将剩下的尾部再进行同样方式的解析。如果第一次分割不能匹配,解析器会向左移动分割点(Address,ZipCode),并继续解析。

     虽然这运用在大多数情况下,但也有可能将属性解析错。假设Person类也有一个addressZip属性,解析器将匹配第一次的分割,其实选择了一个错误的属性并且最终失败(AddressZip中没有code)。要解决这个有歧义性的错误,可以在方法名中利用”_“来手动定义分割点,因此方法名将会像这样:

 

List<Person> findByAddress_ZipCode(ZipCode zipCode);

 

  特殊参数绑定

  以上例子中展示了在查询语句中绑定简单的参数。除此之外,数据访问层还使用一些特殊的类型如Pageable 和、Sort来实现分页和动态排序查询。

 

Page<User> findByLastname(String lastname, Pageable pageable);
List<User> findByLastname(String lastname, Sort sort);
List<User> findByLastname(String lastname, Pageable pageable);

 第一个方法,通过org.springframework.data.domain.Pageable的实例添加分页到已定义的查询语句中,在Pageable实例中绑定了排序项。如果只要排序,可以在参数中仅添加org.springframework.data.domain.Sort参数,你可以看到,返回了一个List对象。在Page实例所需附加元数据不被创建的情况下,只做了一个简单的查询。

 

    创建Repository实例

 

   创建已定义的Repository接口的实例,最简单的方式是通过使用spring命名空间。

 

   基于XML配置

   Spring Data模块包含了一个repositories元素,这个元素允许定义spring扫描的包路径。

 

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://www.springframework.org/schema/data/jpa"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/data/jpa
    http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
  <repositories base-package="com.acme.repositories" />
</beans:beans>

 在这个例子中,"base-package"指定了spring要扫描的包路径com.acme.repositories及全部子包,在这些包下的接口必须继承Repository接口或者是Repository的子接口。基础设施层注册了FactoryBean来代理处理查询方法接口的调用。每个注册的bean名称来源于各接口的名称,因此,UserRepository的接口名称将被注册为userRepository。base-package属性允许采用通配符作为包扫描的格式。

 

   使用过滤器

 

   <repositories />中可以利用<include-filter  />和<exclude-filter  /> 元素来更细粒度的控制接口的实例化。例如,在实例化的时候可以排除一些确定的接口,配置如下:

 

<repositories base-package="com.acme.repositories">
  <context:exclude-filter type="regex" expression=".*SomeRepository" />
</repositories>

 这个例子在接口实例化的时候不包含以SomeRepository结尾的接口。

 

  基于Java的配置

   在javaConfig类上可以通过@Enable${store}Repositories注解来实现。样例如下:

@Configuration
@EnableJpaRepositories("com.acme.repositories")
class ApplicationConfiguration {
  @Bean
  public EntityManagerFactory entityManagerFactory() {
    // …
  }
}

  

   独立用法

   在spring容器之外使用。在项目的类路径下引入spring的包,以编程的方式来来设置Repsitories。SpringData模块中提供了持久类RepositoryFactory来实现,代码如下:

RepositoryFactorySupport factory = … // Instantiate factory here
UserRepository repository = factory.getRepository(UserRepository.class);

 

        1.3自定义SpringData Repositories的实现 

 

       spring data允许自定义实现数据访问的存取方法,并且可以集成常用CRUD和查询功能。

 

       添加自定义的行为

       首先为数据存储建立一个自定义功能的接口及实现。

 

interface UserRepositoryCustom {
  public void someCustomMethod(User user);
}

class UserRepositoryImpl implements UserRepositoryCustom {
  public void someCustomMethod(User user) {
    // Your custom implementation
  }
}

    在标准接口中继承自定义的接口:

 

public interface UserRepository extends CrudRepository<User, Long>, UserRepositoryCustom {
  // Declare query methods here
}

   

     配置

 

    如果使用命名空间配置,数据基础框架会在指定的包下自动搜索自定义的实现类,这些类的名称必须满足在repository-impl-postfix元素中指定的命名约定,这个后缀默认配置为Impl。

 

<repositories base-package="com.acme.repository" />
<repositories base-package="com.acme.repository" repository-impl-postfix="FooBar" />

 第一个配置例子会查找com.acme.repository.UserRepositoryImpl,第二个例子查找com.acme.repository.UserRepositoryFooBar。

 

    手动装配

   前面的例子如果在基于注解并且只有自动适配的情况下可以很好的运行,因为它会在任意的spring Bean中匹配。如果自定义的实现需要手动装配,那需要声明这个bean并且要以刚刚描述的约定去命名。基础框架会引用手动定义的基于名称的bean,而不是创建自身。

 

<repositories base-package="com.acme.repository" />
<beans:bean id="userRepositoryImpl" class="…">
  <!-- further configuration -->
</beans:bean>

 

  为所有的储存添加自定义行为

  当想添加一个自定义的行为在所有储存接口时,前面的例子无法做到。

  1. 定义一个声明共享行为的中间接口。
    public interface MyRepository<T, ID extends Serializable>
      extends JpaRepository<T, ID> {
      void sharedCustomMethod(ID id);
    }
     现在需要各自的储存接口继承这个中间接口,而不是Repository接口。
  2. 接下来,创建一个实现了中间接口并且继承了规范库中的基类,这个类会作为Repository代理的自定义基类来执行。
    public class MyRepositoryImpl<T, ID extends Serializable>
      extends SimpleJpaRepository<T, ID> implements MyRepository<T, ID> {
      private EntityManager entityManager;
      // There are two constructors to choose from, either can be used.
      public MyRepositoryImpl(Class<T> domainClass, EntityManager entityManager) {
        super(domainClass, entityManager);
        // This is the recommended method for accessing inherited class dependencies.
        this.entityManager = entityManager;
      }
      public void sharedCustomMethod(ID id) {
        // implementation goes here
      }
    }
     
分享到:
评论
1 楼 penkee 2013-09-20  
为何我
*/
public interface MemberPlus {
List<Member> getCustomList();
}

public interface MemberDao extends JpaRepository <Member, Long>,MemberPlus {

}

就会报错
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property get found for type main.java.com.company.domain.oa.Member
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:75)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:327)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:353)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:353)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:307)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:271)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:245)
at org.springframework.data.repository.query.parser.Part.<init>(Part.java:72)
at org.springframework.data.repository.query.parser.PartTree$OrPart.<init>(PartTree.java:180)
at org.springframework.data.repository.query.parser.PartTree$Predicate.buildTree(PartTree.java:260)
at org.springframework.data.repository.query.parser.PartTree$Predicate.<init>(PartTree.java:240)
at org.springframework.data.repository.query.parser.PartTree.<init>(PartTree.java:68)

相关推荐

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

    综上所述,这些文档是学习和精通Spring框架、Spring Data JPA以及JPA的宝贵资源,适合Java开发者尤其是从事企业级应用开发的人员参考学习。通过学习和实践,开发者可以更高效地构建和维护数据库驱动的Java应用程序。

    SpringData JPA 参考文档PDF 英文

    整体而言,Spring Data JPA的官方参考文档是一个非常全面的技术指南,它不仅详细阐述了Spring Data JPA的核心特性和使用方法,也提供了与JPA结合使用的高级特性说明。文档中所涉及的知识点涵盖了从简单的仓库接口...

    spring data jpa参考文档

    ### Spring Data JPA 参考文档知识点概览 #### 一、项目元数据 Spring Data JPA 是一个基于 Spring 框架的数据访问抽象层,它简化了 Java 应用程序与关系型数据库之间的交互。该版本为 1.7.2.RELEASE,发布日期为 ...

    spring Data jpa中文参考手册

    Spring Data JPA是Spring基于Hibernate开发的一个JPA框架。如果用过Hibernate或者MyBatis的话,就会知道对象关系映射(ORM)框架有多么方便。但是Spring Data JPA框架功能更进一步,为我们做了 一个数据持久层框架...

    Spring Data JPA1.7中文文档

    Spring Data JPA 是一个强大的框架,它简化了与Java Persistence API (JPA)的交互,提供了对数据库操作的便捷抽象。1.7.0.RELEASE 版本的文档由 Oliver Gierke、Thomas Darimont 和 Christoph Strobl 编写,并由 ...

    Spring Data JPA

    - 官方文档:Spring Data JPA的官方文档提供了详细的API参考和使用指南。 - 在线社区:Stack Overflow、GitHub以及各种技术论坛上有丰富的问答和示例代码,可以帮助解决实际开发中遇到的问题。 掌握Spring Data JPA...

    Spring Data JPA - 开发文档.pdf

    Spring Data JPA参考指南使用的是Apache License 2.0许可协议。使用和分发文档时需要遵循此许可证的规定。 Spring Data JPA的参考指南和开发文档为开发者提供了一个强大的数据访问层解决方案。通过理解这些知识点,...

    spring-data-jpa

    Spring Data JPA 是Spring框架的一个子项目,它提供了基于JPA规范的数据持久化解决方案,主要目的是简化数据访问层的代码。JPA(Java Persistence API)是Java EE(现在是Jakarta EE)的一部分,提供了对象关系映射...

    spring-data-jpa-reference API

    ### Spring Data JPA 参考文档知识点解析 #### 一、引言 Spring Data JPA 是 Spring 框架下的一个子项目,旨在简化 Java 应用程序中的数据访问层开发工作。它提供了丰富的功能来支持 JPA(Java Persistence API)...

    spring data jpa -reference 使用指南(2014年9月版)

    总结起来,《Spring Data JPA - Reference 使用指南》是一份全面且详尽的文档,它覆盖了Spring Data JPA的所有关键方面,从基础概念到高级主题都有涉及。无论是初学者还是经验丰富的开发者,都能从中获得有价值的...

    Spring数据JPA - 中文参考文档

    总的来说,Spring Data JPA 提供了一种简洁、强大的方式来处理数据库操作,降低了与数据存储交互的复杂性。通过注解驱动的编程模型和查询方法的命名约定,开发人员可以更加专注于业务逻辑,而不是底层的持久化细节。

    Spring data jpa-reference

    ### Spring Data JPA 参考文档关键知识点解析 #### 一、引言 Spring Data JPA 是一个基于 Spring 框架的持久层框架,它极大地简化了 Java 应用程序与数据库之间的交互过程。本参考文档将详细介绍 Spring Data JPA ...

    仓库管理系统,SpringBoot+Spring Data JPA+.zip

    本项目采用SpringBoot框架结合Spring Data JPA技术,旨在构建一个功能完善的仓库管理系统,以提升仓储业务的自动化水平。 SpringBoot是Spring生态系统中的一个模块,它通过简化配置和自动配置功能,使得开发Java...

    pring date jpa中文指南文档

    《Spring Data JPA 中文指南》是一份详细阐述Spring Data JPA使用方法和技术的文档,旨在帮助开发者更好地理解和应用这一强大的持久层框架。Spring Data JPA是Spring Framework的一部分,它简化了Java Persistence ...

    基于SpringBoot + SpringData JPA + SpringSecurity + Vue的后台管理系统.zip

    这是一个基于Java技术栈,利用SpringBoot、SpringData JPA、SpringSecurity和Vue.js构建的后台管理系统。这个系统展示了如何在现代Web开发中整合多种技术,实现高效、安全且功能丰富的后端服务。以下是对各部分的...

    spring-data-jpa-reference

    根据提供的描述,“spring-data-jpa-reference”是一份关于Spring Data JPA的详细参考文档,该文档为英文版本,主要面向希望深入了解Spring Data JPA特性和用法的技术人员。 #### 二、Spring Data JPA 核心概念 ##...

    spring jpa reference

    在探讨Spring JPA参考文档之前,首先要明确什么是Spring JPA以及为何Spring Data JPA的出现对开发者社区产生了重要影响。Spring JPA是基于Java持久层API(JPA)的一种技术,它让Java应用通过Java持久API与数据库进行...

    spring-boot-reference-2.04 springBoot文档

    《Spring Boot参考指南2.0.4》与《Spring Data JPA参考文档》是Spring框架开发者的重要参考资料,它们深入解析了Spring Boot和Spring Data JPA的核心概念与实践应用。 Spring Boot是Spring生态系统的简化版,它旨在...

    SpringBoot+JPA

    SpringDataJPA是Spring Data项目的一部分,它提供了对JPA的高级支持,包括查询方法的自动声明、动态查询生成等,使得数据库操作更加简单。 4. **集成步骤** - 添加依赖:在`pom.xml`或`build.gradle`中引入...

Global site tag (gtag.js) - Google Analytics