spring-data-jpa 二、多对一结构、Repository

一、Entity

例如一个user实体和一个department实体  多个用户对应一个部门

1、user类

@id:声明了一个属性映射到数据库主键字段,主键生成策略有@GenerateValue来指定

@Column:声明了一个字段(字段名可以通过name来自定义)

@ManyToOne:多对一,many指的是定义此类的实体(User),one指的是此注解所注解的属性

@JoinColumn:与@ManyToOne配合使用,说明外键字段是“department_id”

package com.nxz.blog;import javax.persistence.*;
import java.util.Date;@Entity
public class User{@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Columnprivate String name;@Column(name = "create_date")private Date createDate;@ManyToOne@JoinColumn(name = "department_id")private Department department;
}

2、department类

@oneToMany:一对多,One指的是次注解所在的实体(department),many是指此注解的属性(User),

在这种一对多的关系映射上,“One”端采用@OneToMany注解是必须使用mapperBy,以声明Many端的对象(这里只User对象)的department属性提供了对应的映射关系

(User为什么使用Set而不是List,这个是jpa要求的,因为Set结构是存放不同元素的集合)

@Entity
class Department {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;@Columnprivate String name;@OneToMany(mappedBy = "department")private Set<User> users = new HashSet<>();}

3、现在越来越多的jpa应用2简化了Entity的定义,去掉了关系映射的相关配置,去掉了数据库外键的设置(类似其他f非ORM),一个表对应一个简单的对象,这样使JPA变得简单

例:(在下边这个User对象中只会用到基本的注解:@Entity、@Id、@GenerateValue、@Column),这样定义Entity,不用理解复杂的映射关系(便于初学者应用)

@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Columnprivate String name;@Column(name = "create_date")private Date createDate;@Column(name = "department_id")private Integer departmentId;
}
@Entity
class Department {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;@Columnprivate String name;}

二、Repository

1、Repository是SpringData的核心,抽象了对数据库和nosql的操作,提供了几个接口:

CurdRepository:提供了基本的增删改查

PagingAndSortingRepository:集成CrudRepository,并提供了分页功能

JPARepository:专门用于JPA,提供了更丰富的数据库访问接口

源码:

CrudRepository:T表示实体,ID表示主键(ID必须实现序列化接口)

import java.util.Optional;@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {<S extends T> S save(S var1);//save方法保存Entity,如果Entity包含主键,SpringData则认为是更新操作<S extends T> Iterable<S> saveAll(Iterable<S> var1);Optional<T> findById(ID var1);/根据主键查询实体,返回Optional对象boolean existsById(ID var1);Iterable<T> findAll();Iterable<T> findAllById(Iterable<ID> var1);long count();void deleteById(ID var1);void delete(T var1);void deleteAll(Iterable<? extends T> var1);void deleteAll();
}

PagingAndSortingRepository:

PageAble是用于构造分页查询的接口,其实现类是PageRequest

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {Iterable<T> findAll(Sort var1);Page<T> findAll(Pageable var1);
}

JpaRepository:Example是SpringData提供的用来构造查询条件的对象

import java.util.List;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;@NoRepositoryBean
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {List<T> findAll();List<T> findAll(Sort var1);List<T> findAllById(Iterable<ID> var1);<S extends T> List<S> saveAll(Iterable<S> var1);void flush();<S extends T> S saveAndFlush(S var1);void deleteInBatch(Iterable<T> var1);void deleteAllInBatch();T getOne(ID var1);<S extends T> List<S> findAll(Example<S> var1);<S extends T> List<S> findAll(Example<S> var1, Sort var2);
}

2、例

最简单的Repository就是直接继承一个接口,下边这个即可实现简单的增删改查

import org.springframework.data.jpa.repository.JpaRepository;public interface U1tsRepository extends JpaRepository<User,Integer> {}

如果需要自定义查询,可以新增基于方法名字的查询:(方法的参数和方法名需要遵循一定的规则,spirngData才能自动转化为sql),

方法名之间可以用And或Or连接

public interface U1tsRepository extends JpaRepository<U1ts, Integer> {U1ts findByName(String name);//方法名是根据查询对象的属性类定义的
}

3、JPA使用@Query注解,手动写JPQL

    @Query("select u from User u where u.name = ?1 and u.department.id = ?2")User findUser(String name,Integer departmentId);

4、如果手写sql,也可以在@Query注解中添加nativeQuery参数

    @Query(value = "select * from user where name = ?1 and department_id = ?2",nativeQuery = true)User findUser1(String name,Integer departmentId);

5、命名参数(sql和jpql都支持)

    @Query(value = "select * from user where name = :name and department_id = :departmentId",nativeQuery = true)User findUser2(String name,Integer departmentId);

6、如果查询结果不是Entity对象,也可以用Object【】数组代替

7、分页

    @Query(value = "select * from user where name = :name and department_id = :departmentId",nativeQuery = true)User findUser2(String name, Integer departmentId, Pageable pageable);

8、跟新删除

    @Modifying//更新和删除必须加modifying注解@Query("update User u set u.name = ?1 where u.id = ?2")User updateUser(String name, Integer id);

三、EntityManager

EntityManger提供了实体操作的所有接口,可以通过@Autowired注入到类中

作用:弥补Repository在复杂查询上的不足

posted @ 2019-04-21 13:13 巡山小妖N 阅读(...) 评论(...) 编辑 收藏

spring-data-jpa 二、多对一结构、Repository相关推荐

  1. ORM框架之Spring Data JPA(二)spring data jpa方式的基础增删改查

    上一篇主要在介绍hibernate实现jpa规范,如何实现数据增删改查,这一篇将会着重spring data jpa 一.Spring Data JPA 1.1 Spring Data JPA介绍: ...

  2. 【Spring Data JPA自学笔记五】一对多、多对多和级联

    文章目录 数据库表的关系 一对多 多对多 Spring Data JPA实现一对多 基本配置 实现一对多 放弃维护权 Spring Data JPA实现多对多 基本配置 实现多对多 级联 之前的所有操 ...

  3. springdatajpa命名规则_简单了解下spring data jpa

    公司准备搭建一个通用框架,以后项目就用统一一套框架了 以前只是听过jpa,但是没有实际用过 今天就来学习下一些简单的知识 什么是JPA 全称Java Persistence API,可以通过注解或者X ...

  4. 第九章SpringBoot整合Spring Data JPA

    目录 1 概述 2 Spring Data JPA整合 2.1 pom文件 2.2 配置文件 2.3 实体类 2.4 Dao接口 2.5 启动类 2.6 编写测试类 3 Spring Data JPA ...

  5. Spring Data JPA教程

    在Java类或对象与关系数据库之间管理数据是一项非常繁琐且棘手的任务. DAO层通常包含许多样板代码,应简化这些样板代码,以减少代码行数并使代码可重复使用. 在本教程中,我们将讨论Spring数据的J ...

  6. Spring Boot————Spring Data JPA简介

    引言 JPA是Java 持久化API的缩写,是一套Java数据持久化的规范, Spring Data Spring Data项目的目的是为了简化构建基于Spring 框架应用的数据访问技术,包括对关系 ...

  7. 从Spring Data JPA访问EntityManager

    Spring Data JPA允许您通过使用Repository接口来快速开发数据访问层. 有时,您需要从Spring Data JPA访问EntityManager. 这篇文章向您展示了如何访问En ...

  8. Spring Data JPA: 实现自定义Repository

    一.前言 由于项目中的 实体(entity)默认都是继承一个父类(包含一些公共的属性,比如创建时间,修改时间,是否删除,主键id).为了实现逻辑删除,一般会自己实现RepositoryFactoryB ...

  9. Spring Data JPA 自定义Repository接口与子接口

    上篇文章介绍了 Repository接口的使用(Spring Data JPA介绍与Spring的整合),接下来重点掌握 Repository的CrudRepository子接口下的子接口. 在dao ...

  10. Spring Data JPA 从入门到精通~自定义实现Repository

    EntityManager 的获取方式 我们既然要自定义,首先讲一下 EntityManager 的两种获取方式. 1. 通过 @PersistenceContext 注解. 通过将 @Persist ...

最新文章

  1. python私有函数
  2. 二维分类教案_大班数学二维分类教案
  3. 引用和指针-内存的分配方式有几种
  4. Leetcode --9
  5. 深度学习的实用层面 —— 1.2 偏差/方差
  6. pandas 使用把dataframe变为series
  7. Java中this和super的区别
  8. pgAdmin4的应用(一)
  9. 未来10年,最值得投资的40个城市
  10. 如何把电视盒子做成游戏机? —— 破解电视IPTV盒子(Skyworth E900-S)
  11. 2021-10-26
  12. 为什么机器学习对嵌入式开发很重要?
  13. Python爬取豆瓣电影top250的电影信息
  14. 给地震监视器添加Notification
  15. kettle中的switch_kettle 条件判断 Switch Case
  16. paddlepaddle框架小白入门级指南
  17. 人工智能基础部分7-高维空间的神经网络认识
  18. 巨一自动化工业机器人_一文了解国内工业机器人系统集成商格局
  19. 贪心问题(二分判定法)---牛棚距离问题
  20. 通过LABVIEW控制安川伺服制作的座椅实验室数据采集系统

热门文章

  1. PHP json_encode不转义中文
  2. php代码编辑器6,优秀的PHP代码编辑器_Blumentals Rapid PHP V13.6 免费版
  3. php+linux+线程安全,PHP 线程安全与非线程安全版本的区别深入解析
  4. 手机抓包app_Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢
  5. shell 获取 mysql 行数_一个Shell小脚本精准统计Mysql每张表的行数实现
  6. Centos 利用yum源安装 nginx stream模块
  7. maven项目,提示One or more constraints have not been satisfied
  8. echarts词云图形状_用Python 3.8绘制词云图就这么20行代码
  9. 手机浏览器android2.,QQ浏览器Android 2.6:畅享版云浏览器大变身
  10. 路径前缀是什么意思_Trie 树是什么样的数据结构?有哪些应用场景?