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;
- @Column
- private 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;
- @Column
- private 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;
- @Column
- private 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;
- @Column
- private 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在复杂查询上的不足
spring-data-jpa 二、多对一结构、Repository的更多相关文章
- <Spring Data JPA>二 Spring Data Jpa
1.pom依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- Spring Data Jpa (二)JPA基础查询
介绍Spring Data Common里面的公用基本方法 (1)Spring Data Common的Repository Repository位于Spring Data Common的lib里面, ...
- Spring Data - Spring Data JPA 提供的各种Repository接口
Spring Data Jpa 最近博主越来越懒了,深知这样不行.还是决定努力奋斗,如此一来,就有了一下一波复习 演示代码都基于Spring Boot + Spring Data JPA 传送门: 博 ...
- Spring Data JPA 提供的各种Repository接口作用
各种Repository接口继承关系: Repository : public interface UserRepository extends Repository<User, Integer ...
- 【ORM框架】Spring Data JPA(一)-- 入门
本文参考:spring Data JPA入门 [原创]纯干货,Spring-data-jpa详解,全方位介绍 Spring Data JPA系列教程--入门 一.Spring Data JPA介 ...
- Spring Data JPA入门
1. Spring Data JPA是什么 它是Spring基于ORM框架.JPA规范封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作.它提供了包括增删改查等在内的常用功能, ...
- Spring Data JPA笔记
1. Spring Data JPA是什么 Spring Data JPA是Spring Data大家族中的一员,它对对持久层做了简化,用户只需要声明方法的接口,不需要实现该接口,Spring Dat ...
- spring data jpa使用原生sql查询
spring data jpa使用原生sql查询 @Repository public interface AjDao extends JpaRepository<Aj,String> { ...
- Spring Data JPA: 实现自定义Repository
一.前言 由于项目中的 实体(entity)默认都是继承一个父类(包含一些公共的属性,比如创建时间,修改时间,是否删除,主键id).为了实现逻辑删除,一般会自己实现RepositoryFactoryB ...
- Spring Boot入门系列(二十六)超级简单!Spring Data JPA 的使用!
之前介绍了Mybatis数据库ORM框架,也介绍了使用Spring Boot 的jdbcTemplate 操作数据库.其实Spring Boot 还有一个非常实用的数据操作框架:Spring Data ...
随机推荐
- Day 2 上午
内容提要: 二叉搜索树 二叉堆 区间RMQ问题 二叉搜索树 前置技能本节课可能用到的一些复杂度:O(log n). n/1+n/2+...+n/n=O(n log n) 入门题: 给出N次操作,每次加 ...
- P3366 【模板】最小生成树
原题链接 https://www.luogu.org/problemnew/show/P3366 一道最小生成树的模板题...... 昨天刚学最小生成树,wz大佬讲的一塌糊涂井然有序,所以我们今天做起 ...
- [GoogleBlog]new-approach-to-china
https://googleblog.blogspot.com/2010/01/new-approach-to-china.html
- 内网MySQL YUM源记录
#mysql yum */180 * * * * rsync -av --delete rsync://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-con ...
- Python--基础二
Python基础:字符串str & 列表list & 元组tuple & 字典dict & 集合set Python 基础 2 字符串 str 字符串是以单引号或双引号 ...
- HDU4899 Hero meet devil DP套DP
陈老师的题QwQ 原题链接 题目大意 有两个字符串\(S\)和\(T\)(都只能由'A','C','G','T'这四个字符组成),\(S\)已知\(T\)未知,还知道\(S\)的长度为\(m\).求满 ...
- js重点--原型链继承详解
上篇说过了关于原型链继承的问题,这篇详解一下. 1. function animals(){ this.type = "animals"; } animals.prototype. ...
- socket(TCP-粘包)通讯之Python实现
所谓粘包问题主要还是C/S两端数据传输时 因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的 根本原因:粘包是由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多 ...
- 基于jeesite的cms系统(五):wangEditor富文本编辑器
一.关于wangEditor: wangEditor —— 轻量级 web 富文本编辑器,配置方便,使用简单.支持 IE10+ 浏览器. 官网:www.wangEditor.com 文档:www.ka ...
- 微信小程序注意点与快捷键
注意点1. 微信对小程序的要求是整体大小不能超过1MB. 2. .json 是配置文件,其内容必须符合JSON格式,所以文件内部不允许有注释. 3. app.json 是全局配置文件,微信小程序中的每 ...