spring-data-jpa 二、多对一结构、Repository
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bootstrap学习(二)页面
- 下一篇: spring security 学习一