日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/9/15 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。