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程式碼-
import java.io.Serializable;
- import org.springframework.data.jpa.repository.JpaRepository;
- publicinterface MyRepository<T, ID extends Serializable>
- extends JpaRepository<T, ID> {
- String sharedCustomMethod();
- }
- import java.io.Serializable;
-
import org.springframework.data.jpa.repository.JpaRepository;
- publicinterface MyRepository<T, ID extends Serializable>
- extends JpaRepository<T, ID> {
- String sharedCustomMethod();
- }
其中sharedCustomMethod是全域性的共享自定義方法。
然後在建一個實現類MyCustomRepository
Java程式碼- import java.io.Serializable;
- import javax.persistence.EntityManager;
- import org.springframework.data.jpa.repository.support.JpaEntityInformation;
- import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
- import org.springframework.data.repository.NoRepositoryBean;
- @NoRepositoryBean
- publicclass MyCustomRepository<T, ID extends Serializable>
- extends SimpleJpaRepository<T, ID> implements MyRepository<T, ID> {
- privatefinal EntityManager entityManager;
- public MyCustomRepository(Class<T> domainClass, EntityManager em) {
- super(domainClass, em);
- // TODO Auto-generated constructor stub
- entityManager=em;
- }
- public MyCustomRepository(final JpaEntityInformation<T, ?> entityInformation, final EntityManager entityManager) {
- super(entityInformation, entityManager);
- this.entityManager = entityManager;
- }
- public String sharedCustomMethod() {
- return"hello sharedCustomMethod";
- // implementation goes here
- }
- }
- import java.io.Serializable;
- import javax.persistence.EntityManager;
- import org.springframework.data.jpa.repository.support.JpaEntityInformation;
- import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
- import org.springframework.data.repository.NoRepositoryBean;
- @NoRepositoryBean
- publicclass MyCustomRepository<T, ID extends Serializable>
- extends SimpleJpaRepository<T, ID> implements MyRepository<T, ID> {
- privatefinal EntityManager entityManager;
- public MyCustomRepository(Class<T> domainClass, EntityManager em) {
- super(domainClass, em);
- // TODO Auto-generated constructor stub
- entityManager=em;
- }
- public MyCustomRepository(final JpaEntityInformation<T, ?> entityInformation, final EntityManager entityManager) {
- super(entityInformation, entityManager);
- this.entityManager = entityManager;
- }
- public String sharedCustomMethod() {
- return"hello sharedCustomMethod";
- // implementation goes here
- }
- }
注意 @NoRepositoryBean一定要有的,還有全域性的擴充套件實現類不要用Imp作為字尾名,不然會報異常的(目前還沒搞清楚報異常的具體原因,個人猜測可能是和區域性的擴充套件有衝突吧)。
然後在定義MyRepositoryFactory
Java程式碼- import java.io.Serializable;
- importstatic org.mockito.Mockito.*;
- import javax.persistence.EntityManager;
- import org.springframework.data.jpa.repository.JpaRepository;
- import org.springframework.data.jpa.repository.support.JpaEntityInformation;
- import org.springframework.data.jpa.repository.support.JpaRepositoryFactory;
- import org.springframework.data.repository.core.RepositoryMetadata;
- publicclass MyRepositoryFactory extends JpaRepositoryFactory {
- public MyRepositoryFactory(EntityManager entityManager) {
- super(entityManager);
- // TODO Auto-generated constructor stub
- }
- @Override
- @SuppressWarnings("unchecked")
- protected JpaRepository<?, ?> getTargetRepository(RepositoryMetadata metadata, EntityManager em) {
- JpaEntityInformation<Object, Serializable> entityMetadata = mock(JpaEntityInformation.class);
- when(entityMetadata.getJavaType()).thenReturn((Class<Object>) metadata.getDomainType());
- returnnew MyCustomRepository<Object, Serializable>(entityMetadata, em);
- }
- /*
- * (non-Javadoc)
- *
- * @see
- * org.springframework.data.repository.support.RepositoryFactorySupport#
- * getRepositoryBaseClass()
- */
-
相關推薦
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;