1. 程式人生 > >Spring Data JPA 全域性DAO的擴充套件(第一次用JPA時總是提示 另人抓狂的錯誤: No property find for type class )

Spring Data JPA 全域性DAO的擴充套件(第一次用JPA時總是提示 另人抓狂的錯誤: No property find for type class )

前幾天看了springside4的mini-web程式碼發現確實有不少新的東東,咱這次單說說Spring Data JPA吧。 

引用springside4的 wiki關於對Spring Data JPA的簡介 

Spring Data JPA在JPA上又做了一層封裝,只要編寫介面就夠了,不用寫一行實現程式碼,CRUD方法啦,分頁啦,自動將findByLoginName()的方法定義翻譯成適當的QL啦都由它包了:

public interface UserDao extends PagingAndSortingRepository<User, Long> { 
User findByLoginName(String loginName); 

使用上很簡單,快速瀏覽一下下面的資料就夠了。 

只有一個坑爹的地方,如果要為UserDao擴充套件方法(而不是介面),要新增一個UserDaoCustom介面,這時候,實現類的名字必須是UserDaoImpl,而不是UserDaoCustomImpl。


另外,除了智慧地翻譯連Less,Not,And,Or都支援的方法名,它當然也可以直接用@Query在方法上標註複雜的查詢語句。 

資料 
官方文件

 如果看完上面的資料 也許你對Spring Data JPA有了初步的認識,動動手你就知道他的強大,但是對DAO的擴充套件上有點麻煩,上面紅字部分是對單個dao進行擴充套件的方法。下面我們來說一下對全域性DAO的擴充套件,建立你自己的CustomRepository。

首先咱們要建一個自己的擴充套件介面類MyRepository

Java程式碼 複製程式碼 收藏程式碼
  1. import java.io.Serializable;   
  2. import org.springframework.data.jpa.repository.JpaRepository;   
  3. publicinterface MyRepository<T, ID extends Serializable>    
  4. extends JpaRepository<T, ID> {   
  5. String  sharedCustomMethod();   
  6. }  
  1. import java.io.Serializable;  
  2. import org.springframework.data.jpa.repository.JpaRepository;  
  3. publicinterface MyRepository<T, ID extends Serializable>   
  4. extends JpaRepository<T, ID> {  
  5. String  sharedCustomMethod();  
  6. }  

其中sharedCustomMethod是全域性的共享自定義方法。

然後在建一個實現類MyCustomRepository

Java程式碼 複製程式碼 收藏程式碼
  1. import java.io.Serializable;   
  2. import javax.persistence.EntityManager;   
  3. import org.springframework.data.jpa.repository.support.JpaEntityInformation;   
  4. import org.springframework.data.jpa.repository.support.SimpleJpaRepository;   
  5. import org.springframework.data.repository.NoRepositoryBean;   
  6. @NoRepositoryBean
  7. publicclass MyCustomRepository<T, ID extends Serializable>    
  8. extends SimpleJpaRepository<T, ID> implements MyRepository<T, ID> {   
  9. privatefinal EntityManager entityManager;   
  10. public MyCustomRepository(Class<T> domainClass, EntityManager em) {   
  11. super(domainClass, em);   
  12. // TODO Auto-generated constructor stub
  13.         entityManager=em;   
  14.     }   
  15. public MyCustomRepository(final JpaEntityInformation<T, ?> entityInformation, final EntityManager entityManager) {   
  16. super(entityInformation, entityManager);   
  17. this.entityManager = entityManager;   
  18. }   
  19. public String sharedCustomMethod() {   
  20. return"hello sharedCustomMethod";   
  21. // implementation goes here
  22. }    
  23. }  
  1. import java.io.Serializable;  
  2. import javax.persistence.EntityManager;  
  3. import org.springframework.data.jpa.repository.support.JpaEntityInformation;  
  4. import org.springframework.data.jpa.repository.support.SimpleJpaRepository;  
  5. import org.springframework.data.repository.NoRepositoryBean;  
  6. @NoRepositoryBean
  7. publicclass MyCustomRepository<T, ID extends Serializable>   
  8. extends SimpleJpaRepository<T, ID> implements MyRepository<T, ID> {  
  9. privatefinal EntityManager entityManager;  
  10. public MyCustomRepository(Class<T> domainClass, EntityManager em) {  
  11.         super(domainClass, em);  
  12.         // TODO Auto-generated constructor stub
  13.         entityManager=em;  
  14.     }  
  15. public MyCustomRepository(final JpaEntityInformation<T, ?> entityInformation, final EntityManager entityManager) {  
  16.     super(entityInformation, entityManager);  
  17.     this.entityManager = entityManager;  
  18. }  
  19. public String sharedCustomMethod() {  
  20.     return"hello sharedCustomMethod";  
  21.   // implementation goes here
  22. }   
  23. }  

 注意 @NoRepositoryBean一定要有的,還有全域性的擴充套件實現類不要用Imp作為字尾名,不然會報異常的(目前還沒搞清楚報異常的具體原因,個人猜測可能是和區域性的擴充套件有衝突吧)。

然後在定義MyRepositoryFactory

Java程式碼 複製程式碼 收藏程式碼
  1. import java.io.Serializable;   
  2. importstatic org.mockito.Mockito.*;   
  3. import javax.persistence.EntityManager;   
  4. import org.springframework.data.jpa.repository.JpaRepository;   
  5. import org.springframework.data.jpa.repository.support.JpaEntityInformation;   
  6. import org.springframework.data.jpa.repository.support.JpaRepositoryFactory;   
  7. import org.springframework.data.repository.core.RepositoryMetadata;   
  8. publicclass MyRepositoryFactory extends JpaRepositoryFactory {   
  9. public MyRepositoryFactory(EntityManager entityManager) {   
  10. super(entityManager);   
  11. // TODO Auto-generated constructor stub
  12.     }   
  13. @Override
  14. @SuppressWarnings("unchecked")   
  15. protected JpaRepository<?, ?> getTargetRepository(RepositoryMetadata metadata, EntityManager em) {   
  16.         JpaEntityInformation<Object, Serializable> entityMetadata = mock(JpaEntityInformation.class);   
  17.         when(entityMetadata.getJavaType()).thenReturn((Class<Object>) metadata.getDomainType());   
  18. returnnew MyCustomRepository<Object, Serializable>(entityMetadata, em);   
  19.     }   
  20. /*  
  21.      * (non-Javadoc)  
  22.      *   
  23.      * @see  
  24.      * org.springframework.data.repository.support.RepositoryFactorySupport# 
  25.      * getRepositoryBaseClass() 
  26.      */
  27. 相關推薦

    Spring Data JPA 全域性DAO擴充套件(第一JPA總是提示 錯誤 No property find for type class )

    前幾天看了springside4的mini-web程式碼發現確實有不少新的東東,咱這次單說說Spring Data JPA吧。  引用springside4的 wiki關於對Spring Data JPA的簡介  Spring Data JPA在JPA上又

    spring報錯"No property ... found for type..."

    遇到很多次這個問題了,可能正是因為沒有寫一篇部落格,才導致我一直踩坑. 這個問題的原因,我遇到的只有一個,就是Spring Data JPA的Entity實體沒有對應好,具體怎麼說呢 這樣,我遇到的問題是這樣,我的資料庫中的欄位是publish_time,然後為了偷懶,在JavaBean中,

    第一建立JPA

    ------------------------------------------------------------------------------------------------------------------------------------

    第一STL中的set

    根據 class 兩個 print 整數 而且 -- 關聯 輸入 給你兩個集合,要求{A} + {B}. 註:同一個集合中不會有兩個相同的元素. Input每組輸入數據分為三行,第一行有兩個數字n,m(0<n,m<=10000),分別表示集合A和集合B的元素個

    第一伺服器(二)專案打包執行

    開發環境:IDEA 2018.1 基於SpringBoot 2.0 + Maven1. 首先打包:  在pom.xml中配置: <groupId>自定義</groupId> <artifactId>自定義</artifactId> <

    第一伺服器(一) 環境配置

    當個備忘錄,防止重置系統以後忘了要幹啥 環境:學生機 1CPU 2G 50G 1M,包年+.cn域名 128RMB,預裝ubuntu 16.04 32bit  1.java & mysql  openjdk安裝: sudo add-apt-repository p

    第一startuml畫例圖

    真的 title 網上 可能 usecase 而不是 ase 開始 但是 可能大概是我太笨了,在第一次用startuml這個軟件時,碰到了很傻缺的問題。雖然後來發現真的很簡單,但是還是想跟大家分享一下,以防有人運氣不好碰到我這個問題。 最開始的時候,我打算畫個用例圖,要畫用

    poj 1502 MPI Maelstrom dijkstra 第一

    #include<iostream> #include<stdio.h> #include<string.h> #include<cstring> #include<algorithm> #include<st

    第一vector容器

    /*設有n個正整數,將他們連線成一排,組成一個最大的多位整數。 如:n=3時,3個整數13,312,343,連成的最大整數為34331213。 如:n=4時,4個整數7,13,4,246連線成的最大整數為7424613。 輸入描述: 有多組測試樣例,每組測試樣例包含兩行,第一

    第一

    2018年11月07日 12:40:06 劉方啊 閱讀數:2 標籤: 1

    第一mybatis

    初入mybatis mybatis成功邁出第一步! 你需要配置幾個配置檔案 jdbc.properties(連線資料庫) log4.properties(列印日誌) sqlMapConfig.xml(MySQL指令碼檔案) 需要建立幾個包: dao junit mapper poj

    第一Go寫程式解決Python效能問題

    Go 學習有一段時間了,書還差一點沒看完,一直沒動手寫程式碼。 場景: 近期客戶抱怨我們給的資料匯出工具太慢了,領導說看看能不能優化。 思考: 第一時間想到了用Go,因為學了一段時間,也想實戰一下。 Go的速度是接近C/C++的,併發容易,且這個工具執行的任務都是一個個資料檔案解析,

    第一latex引用參考文獻一直失敗的解決方案

    在使用Latex之前,我們一般會借用已有的論文模板,在模板基礎上加入我們自己的文章內容,隨後編譯成PDF檔案,其基本流程就是:Latex->Bibtex->Latext->Latex。   1、第一步點選Latex編譯,可以獲得*.aux檔案、*.dvi檔

    第一ffplay播放視訊的過程以及ffplay使用說明書

    編譯好的ffmpeg資料夾下有ffplay和ffplay_g兩個可執行檔案,發現這兩個功能是一樣的,不知道到底什麼區別. 其他的可執行檔案,也是這個樣子的. ======= 直接輸入ffplay後 [email protected]:/home/zh

    第一寫快速排序演算法出現棧溢位和排序錯誤的問題

    從昨天開始看快速排序演算法, 自己看了一會明白了快速排序演算法的原理,想把它寫出來。可是說起來簡單做起來難,本應該是很簡潔的程式碼我卻怎麼也寫不對,尤其是快速排序演算法有遞迴呼叫,很鍛鍊思維能力。 剛剛按照網上的一段程式進行編寫,一邊看示例程式碼一邊寫自己的程式碼,卻出現了

    當文字框第一獲得焦點,清空文字框中原有的內容

    如何讓文字框內的提示資訊在啟用文字框時清空 解決思路:     當需要填寫的文字框很多時,在每個文字框內寫上提示資訊是個不錯的辦法,但這樣一來使用者在填寫該項時必須先把提示文字刪掉,非常不方便。所以應該讓文字框更人性化一點,在focus時檢查當前值是否為文字框的預設值,是則清空,否則保持不變,而在blur時檢

    第一 Java寫UI

    以後還是要用Eclipse 作為GUI的Framework:) import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*; public class LookAndFe

    第一CSDN寫部落格,試試看

    總覺得如果要把Java學好,JDK目錄下面的src裡面常用類的方法你要清楚是怎麼實現的。 1.讀原始碼: 以前學的時候覺得Java好方便,什麼方法都是寫好的,我直接瞭解API,呼叫就行,可是到了工作,我越發的覺得原始碼裡面的東西才是最精髓的。於是我在不懂的地方一般會ctrl+滑鼠左鍵在eclipse中檢視

    第一IntelliJ Idea寫web程式配置Tomcat遇到的問題

           以前寫java程式一直用的是Myeclipse,後來感覺這個編譯器不是很好用,偶然間嘗試了IntelliJ,覺得比Myeclipse不知道強多少倍。但是今天第一次用它寫web程式,卻發現配置完Tomcat

    WPF——控制元件繫結到資料後 第一載入介面繫結成功 但後來資料來源發生變化 控制元件無變化

    1.在 window_Loaded中設定物件繫結到源 private void window_Loaded(object sender, RoutedEventArgs e) { CurUserName.DataContext = CurrentUserAAA;