最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JPA @Basic單表查詢?nèi)绾螌崿F(xiàn)大字段懶加載

 更新時間:2021年08月02日 14:42:41   作者:c&0xff00  
這篇文章主要介紹了JPA @Basic單表查詢?nèi)绾螌崿F(xiàn)大字段懶加載的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

JPA @Basic單表查詢實現(xiàn)大字段懶加載

近期看了JPA@Basic注解的使用,看到該注解可以設置字段的懶加載。

1.以前碰到的懶加載:

我們知道,多表關聯(lián)的時候,我們是可以配置懶加載的,比如一個Company類,里面可以關聯(lián)員工表,辦公設備表,當我們查看公司信息的時候,我們并不需要直接加載員工表,辦公設備表,只需要在用戶查看員工,查看設備的時候再加載,這樣可以提高加載效率。

長話短說,大概是這樣子的

	@Entity
	@Table(name = "Company")
	public class Company {
 
		@OneToMany(mappedBy = "cId", fetch = FetchType.LAZY)
		private List<Employee>  employees;
 
		// other properties
 
		//getters and setters
	}

2、單表大字段懶加載

對于一張表時,里面有一個存儲用戶頭像的字段,我們只需要當用戶點入用戶詳情頁的時候才去加載頭像,其余時間不用加載。例如為什么你微信換了頭像,其他人是不能在群聊中立即看到的,需要你查看用戶詳情時才會看到一樣。

寫了一個例子:

新建test表:

實體類:

@Entity
@Table(name = "TEST")
public class TestCMP {
 
	@Id
	@IdSequenceConsumer(producerClass = UUIDProducer.class)
	private String id;
 
	@Lob
	@Basic(fetch = FetchType.LAZY)
	private String image;
 
	private String name;
    
    //getters and setters
}

repository接口:

@Repository
public interface TestRepository extends CrudRepository<TestCMP,String> {
}

測試方法:

	@Test
	@Transactional(value = "nwTransactionManager")
	public void BasicTest3() {
		TestCMP testCMP = testRepository.findOne("12345"); //懶加載,image沒有查出來
		System.out.println(testCMP);
		System.out.println(testCMP.getImage()); //主動去獲取image,進行加載
	}

1、看到網(wǎng)上有同學直接設置了@Basic注解,沒有實現(xiàn)的截圖。

但我試一下,并沒有實現(xiàn)懶加載,還是一次性就加載出來了。

打出來的sql為全查,沒有實現(xiàn)懶加載:

select testcmp0_.id as id1_0_0_, testcmp0_.image as image2_0_0_, testcmp0_.name as name3_0_0_ from TEST testcmp0_ where testcmp0_.id=?

2、分析其中原因,應是:即使我通過@Basic設置了懶加載,但有getter,toString方法,已經(jīng)不允許它懶加載了,所以會全查。

3、讓實體類實現(xiàn)FieldHandled接口,這個接口,目的就是利用FieldInterceptorImpl這個類,他專門對懶加載的字段加了一個攔截器,能夠將懶加載的值注入到實體類中。(這類似于將懶加載的字段與原有代碼隔離開,加載的時候再寫進去,讀出來)

將實體類改為:

@Entity
@Table(name = "TEST")
public class TestCMP implements FieldHandled{
 
	@Id
	@IdSequenceConsumer(producerClass = UUIDProducer.class)
	private String id;
 
	@Lob
	@Basic(fetch = FetchType.LAZY)
	private String image;
 
	private String name;
 
	@Transient
	@JsonIgnore
	private FieldHandler fieldHandler;
 
	@Override
	public void setFieldHandler(FieldHandler handler) {
		this.fieldHandler = handler;
	}
 
	@Override
	public FieldHandler getFieldHandler() {
		return fieldHandler;
	}
 
	/**
	 * 獲取image
	 *
	 * @return image
	 */
	public String getImage() {
		if (fieldHandler != null) {
			return (String) fieldHandler.readObject(this, "image", this.image);
		}
		return null;
	}
    // other getters and setters
}

首先查詢sql:懶加載不查詢image

select testcmp0_.id as id1_0_0_, testcmp0_.name as name3_0_0_ from TEST testcmp0_ where testcmp0_.id=?

當獲取image時sql:

select testcmp_.image as image2_0_ from TEST testcmp_ where testcmp_.id=?

打印testCMP的結果:

TestCMP@d56fc13[id=12345,image=<null>,name=jenkins, fieldHandler=FieldInterceptorImpl(entityName={路徑省略}.cmp.TestCMP,dirty=false,uninitializedFields=[image])]

注意點:

第一次查詢與加載懶加載數(shù)據(jù),應在同一個事務中,如

如果查和加載懶加載數(shù)據(jù)在不同的方法中,可以對整個service加事務@Transactional

jpa 懶加載 、N+1、指定字段查詢示例

屬性懶加載

說明:默認情況下,實體的屬性會被立即加載(一次全部加載)。但是,我們也可以延遲加載它們。這對于存儲大量數(shù)據(jù)的列類型有用:CLOB,BLOB,VARBINARY

配置項

spring.jpa.open-in-view=false
@Basic(fetch = FetchType.LAZY)

查詢的實體類如果進行get懶加載屬性操作,會出現(xiàn)N+1性能問題

控制字段輸出

@Entity
@JsonInclude(Include.NON_EMPTY)

避免對具有空值的字段進行序列化

指定字段查詢1(接口式)

定義接口類

 public class AuthorDto implements Serializable {
    private static final long serialVersionUID = 1L;
    private final String name;
    private final int age;
    public AuthorDto(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}

repository

@Repository
public interface AuthorRepository extends JpaRepository<Author, Long> {
    @Transactional(readOnly = true)    
    List<AuthorDto> findByGenre(String genre);
}

指定字段查詢2(構造函數(shù)式)

定義接口類

 public class AuthorDto implements Serializable {
    private static final long serialVersionUID = 1L;
    private final String name;
    private final int age;
    public AuthorDto(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}

repository

@Repository
public interface AuthorRepository extends JpaRepository<Author, Long> {
    @Transactional(readOnly = true)
    @Query(value = "SELECT new com.bookstore.dto.AuthorDto(a.name, a.age) FROM Author a")
    List<AuthorDto> fetchAuthors();
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • java普通項目讀取不到resources目錄下資源文件的解決辦法

    java普通項目讀取不到resources目錄下資源文件的解決辦法

    這篇文章主要給大家介紹了關于java普通項目讀取不到resources目錄下資源文件的解決辦法,Web項目中應該經(jīng)常有這樣的需求,在maven項目的resources目錄下放一些文件,比如一些配置文件,資源文件等,需要的朋友可以參考下
    2023-09-09
  • Java如何獲取當前進程ID以及所有Java進程的進程ID

    Java如何獲取當前進程ID以及所有Java進程的進程ID

    本篇文章主要介紹了Java如何獲取當前進程ID以及所有Java進程的進程ID,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • SpringBoot集成ffmpeg實現(xiàn)視頻轉碼播放示例詳解

    SpringBoot集成ffmpeg實現(xiàn)視頻轉碼播放示例詳解

    這篇文章主要為大家介紹了SpringBoot集成ffmpeg實現(xiàn)視頻轉碼播放示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 解決idea打包成功但是resource下的文件沒有成功的問題

    解決idea打包成功但是resource下的文件沒有成功的問題

    這篇文章主要介紹了解決idea打包成功但是resource下的文件沒有成功的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • web中拖拽排序和java后臺交互實現(xiàn)方法示例

    web中拖拽排序和java后臺交互實現(xiàn)方法示例

    這篇文章主要給大家介紹了關于web中拖拽排序和java后臺交互實現(xiàn)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • Java內(nèi)存模型及其作用詳解

    Java內(nèi)存模型及其作用詳解

    在現(xiàn)代計算機系統(tǒng)中,尤其是多處理器架構下,每個處理器都有自己的高速緩存,而主內(nèi)存(RAM)是所有處理器共享的數(shù)據(jù)存儲區(qū)域,這篇文章主要介紹了深入理解Java內(nèi)存模型及其作用,需要的朋友可以參考下
    2024-04-04
  • 有關ServletConfig與ServletContext的訪問

    有關ServletConfig與ServletContext的訪問

    下面小編就為大家?guī)硪黄嘘PServletConfig與ServletContext的訪問。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Spring Session的使用示例

    Spring Session的使用示例

    最近團隊一個項目需要使用Session,之前沒有在實際項目中使用過Spring-Session,這里記錄一下使用的過程
    2021-06-06
  • springboot之如何獲取請求ip方法

    springboot之如何獲取請求ip方法

    這篇文章主要介紹了springboot之如何獲取請求ip方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot使用CXF集成WebService的方法

    SpringBoot使用CXF集成WebService的方法

    這篇文章主要介紹了SpringBoot使用CXF集成WebService的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08

最新評論

辽源市| 仙居县| 平乐县| 甘德县| 甘德县| 郎溪县| 万年县| 万年县| 肃南| 洛南县| 曲松县| 石狮市| 兴安盟| 株洲市| 仁布县| 时尚| 金坛市| 曲水县| 通州市| 凉山| 沾化县| 绥宁县| 青岛市| 绍兴市| 汝城县| 颍上县| 卢湾区| 黔西| 五指山市| 油尖旺区| 大名县| 八宿县| 固镇县| 潍坊市| 汾西县| 弥勒县| 昌宁县| 馆陶县| 泽普县| 临邑县| 会东县|