項目中JPA的使用

個人理解

1种吸、定義一個xxxRepository繼承JpaRepository
2闷串、在定義的與數(shù)據(jù)庫對應(yīng)的類上加相應(yīng)的@NamedQuery方法
3窘拯、實現(xiàn)xxxxDaoImple,xxxxrepository和entityManager實現(xiàn)DaoImple中的具體方法瘩蚪,一般簡單的方法則用xxxxRepository類中的方法來實現(xiàn)
4就乓、xxxRepository只是相當(dāng)于把原來在dao層實現(xiàn)的簡單方法汉匙,他本身封裝起來了

javaConfig配置jpa

1、在LifeCircleWebConfig中@import (ApplicationConfig.class)就是引入jpa的配置到configuration的配置文件中去

LifeCircleWebConfig

2生蚁、配置ApplicationConfig類噩翠,它作為配置jpa的文件
圖中數(shù)字解釋:
1、要掃描這個的包邦投,把這個包繼承與JpaRepository的類都裝到容器中成為一個bean
2绎秒、指定他的工廠類
3、導(dǎo)入xml文件尼摹,為后面的datasource的配置引入數(shù)據(jù)
4见芹、引入InfrastructureConfig,和InfrastructureConfig4Question類蠢涝,在這兩個類中主要是配置entityManagerFactorytransactionManagerdefaultJdbcTemplate
ApplicationConfig

3玄呛、在MyRepositoryFactoryBean中如何引入代理的ProxyRepositoryImpl來實現(xiàn)的
(1)MyRepositoryFactoryBean在這定義一個內(nèi)部成員類MyRepositoryFactory,這個類繼承與
JpaRepositoryFactory和二,在這個類的構(gòu)造方法中徘铝,把TransactionTemplate,JdbcTemplate惯吕,EntityManager等值給他惕它,與數(shù)據(jù)庫建立連接
Paste_Image.png

(2)編寫getTargetRepository方法,告訴程序要返回的是ProxyRepositoryImpl废登,及所有的實現(xiàn)都是代理來做的淹魄,代理類中保存有具體的Repository
Paste_Image.png

(3)編寫getRepositoryBaseClass方法,獲取baseclass
Paste_Image.png

(4)MyRepositoryFactoryBean實現(xiàn)方法createRepositoryFactory方法堡距,返回MyRepositoryFactory工廠類
Paste_Image.png

通過上面操作實現(xiàn)了指定Repository的工廠類甲锡。


xml和javaconfig配置jpa的區(qū)別參考

數(shù)字對照


Paste_Image.png

在InfrastructureConfig中


Paste_Image.png

在ApplicationConfig
Paste_Image.png

在InfrastructureConfig中


Paste_Image.png
Paste_Image.png

在InfrastructureConfig中


Paste_Image.png

Paste_Image.png

還是有些地方不清楚有時間在仔細(xì)看下,自己配置下


jpa配置自定義方法的

詳細(xì)的參考
參考

1.根據(jù)方法名稱
2.JPA的NameQueryies
注意命名的時要遵循DomainClass.methodName()的命名規(guī)則
(1):在實體類上使用@NamedQuery羽戒,示例如下:
@NamedQuery(name = "UserModel.findByAge",query = "select o from UserModel o where o.age >= ?1")
(2):在自己實現(xiàn)的DAO的Repository接口里面定義一個同名的方法缤沦,示例如下:
public List<UserModel> findByAge(int age);
(3):然后就可以使用了,Spring會先找是否有同名的NamedQuery易稠,如果有缸废,那么就不會按照接口定義的方法來解析。
3.@Query方式
在接口的方法上加注解,@Query 注解的使用非常簡單企量,只需在聲明的方法上面標(biāo)注該注解测萎,在變量上加上@Param("nn"),并且在sql語句中采用:nn來注入?yún)?shù)
@Query(value="select o from UserModel o where o.name like %:nn")
public List<UserModel> findByUuidOrAge(@Param("nn") String name);

多表查找的時候jpa怎么做

Paste_Image.png

就和平常寫sql語句一樣梁钾,只是table名稱變?yōu)橐粋€個與數(shù)據(jù)庫表關(guān)聯(lián)的

項目中怎么使用的

1绳泉、把所有的Repository的bean放到commonServiceHelper類中的map對象中逊抡,map的key是resType姆泻,使用的時候通過resType獲得相對應(yīng)的Repository
2、在包repository--sdk下找AssetRepository冒嫡,繼承了JpaRepository
3拇勃、增加的方法寫在Asset實體類通過JPA的NameQueryies方式


Paste_Image.png

但是沒得參數(shù)注入,都是where后面直接寫參數(shù)的
4孝凌、具體的使用可參考AssetDaoImpl


Paste_Image.png

先過去EntityManage方咆,直接createNamedQuery獲取Query,再對參數(shù)設(shè)置相應(yīng)的值query.setParameter("category", category);
再運行得值
5蟀架、sql中占位符
Paste_Image.png

JpaRepository常用方法

T save(T entity);//保存單個實體
Iterable<T> save(Iterable<? extends T> entities);//保存集合
T findOne(ID id);//根據(jù)id查找實體
boolean exists(ID id);//根據(jù)id判斷實體是否存在
Iterable<T> findAll();//查詢所有實體,不用或慎用!
long count();//查詢實體數(shù)量
void delete(ID id);//根據(jù)Id刪除實體
void delete(T entity);//刪除一個實體
void delete(Iterable<? extends T> entities);//刪除一個實體的集合
void deleteAll();//刪除所有實體,不用或慎用!

項目中給他封裝為

public T add(T bean)保存
public void del(String id)
public T update(T bean)
public T getByExample(T entity)
public List<T> getAllByExample(T entity)

education = (Education) resourceRepository.add(education);
 education = (Education) resourceRepository.update(education)瓣赂;
parentAsset = assetRepository.get(parent);//判斷資源是否存在

獲取這個repository對應(yīng)的entityManager對象public EntityManager getEntityManager()

項目代碼參考

用createNamedQuery

 public Chapter getLastChapterOnSameLevel(String mid, String parent) {
        Chapter lastOne = null;       
        Query query =        chapterRepository.getEntityManager().createNamedQuery("getLastChapterOnSameLevel");
        query.setParameter("tmid", mid);
        query.setParameter("pid", parent);
        query.setFirstResult(0);       //表示的是從查詢記錄的地幾個開始,而不是從第幾頁開始
        query.setMaxResults(1);       //最多查詢出幾條
        List<Chapter> result = query.getResultList();   
        if(CollectionUtils.isNotEmpty(result)){
            lastOne = result.get(0);
        }  
        return lastOne;
    }

用em.createNativeQuery

public List<KnowledgeBaseModel> queryKnowledgeBaseListByKpid(String kpid) {
        List<KnowledgeBaseModel> returnList = new ArrayList<KnowledgeBaseModel>();
        String sql = "SELECT kb.identifier,kb.knid,kb.kpid,nd.title,nd.description,nd.creator,nd.create_time,cd1.title as kcname,cd2.title as kpname FROM knowledge_base kb,ndresource nd,category_relations cr,category_datas cd1,category_datas cd2 where cr.source=cd1.identifier and cr.target = cd2.identifier and cr.source=:kpid and kb.kpid = cr.target and nd.primary_category = 'knowledges' and nd.enable = 1 and kb.knid = nd.identifier";
        Query query = em.createNativeQuery(sql);
        query.setParameter("kpid", kpid);
        List<Object[]> list = query.getResultList();
        if(CollectionUtils.isNotEmpty(list)){
            for (Object[] o : list) {
                KnowledgeBaseModel kbm = new KnowledgeBaseModel();
                kbm.setIdentifier((String)o[0]);
                kbm.setKnid((String)o[1]);
                kbm.setKpid((String)o[2]);
                kbm.setTitle((String)o[3]);
                kbm.setDescription((String)o[4]);
                kbm.setCreator((String)o[5]);
                if(o[6] != null){
                    kbm.setCreateTime(new Date(((BigInteger)o[6]).longValue()));
                }
                kbm.setKcName((String)o[7]);
                kbm.setKpName((String)o[8]);
                returnList.add(kbm);
            }
        }
        return returnList;
    }

也有使用@Query方式的

public interface ResourceRelationRepository extends ResourceRepository<ResourceRelation>,
        JpaRepository<ResourceRelation, String> {   
    @Query("SELECT DISTINCT(p.target) FROM ResourceRelation p where p.sourceUuid in (?1) AND p.resourceTargetType=?2 AND relationType = ?3")
    List<String> findTargetIdsBySourceIdsAndTargetType(List<String> sourceIds,String targetType,String relationType);
    
    @Query("SELECT DISTINCT(p.sourceUuid) FROM ResourceRelation p where p.target in (?1) AND p.resType=?2 AND relationType = ?3")
    List<String> findSourceIdsByTargetIdsAndResType(List<String> targetIds,String resType,String relationType);

    @Query("SELECT t1 FROM ResourceRelation t1 where t1.resType=?1 and t1.resourceTargetType=?2 and t1.enable=1 and EXISTS(select 1 from Education t2 where t1.sourceUuid=t2.identifier and t2.enable=1) and EXISTS(select 1 from Education t2 where t1.target=t2.identifier and t2.enable=1) and t1.target=?3 ")
    List<ResourceRelation> findByResTypeAndTargetTypeAndTargetId(String resType, String targetType, String targetId);

    @Query("SELECT t1 FROM ResourceRelation t1 where t1.resType=?1 and t1.resourceTargetType=?2 and t1.enable=1 and EXISTS(select 1 from Education t2 where t1.sourceUuid=t2.identifier and t2.enable=1) and EXISTS(select 1 from Education t2 where t1.target=t2.identifier and t2.enable=1) and t1.sourceUuid=?3 ")
    List<ResourceRelation> findByResTypeAndTargetTypeAndSourceId(String resType, String targetType, String sourceId);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末片拍,一起剝皮案震驚了整個濱河市煌集,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捌省,老刑警劉巖苫纤,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纲缓,居然都是意外死亡卷拘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門祝高,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栗弟,“玉大人,你說我怎么就攤上這事工闺『嵬龋” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵斤寂,是天一觀的道長耿焊。 經(jīng)常有香客問我,道長遍搞,這世上最難降的妖魔是什么罗侯? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮溪猿,結(jié)果婚禮上钩杰,老公的妹妹穿的比我還像新娘纫塌。我一直安慰自己,他們只是感情好讲弄,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布措左。 她就那樣靜靜地躺著,像睡著了一般避除。 火紅的嫁衣襯著肌膚如雪怎披。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天瓶摆,我揣著相機與錄音凉逛,去河邊找鬼。 笑死群井,一個胖子當(dāng)著我的面吹牛状飞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播书斜,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诬辈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了荐吉?” 一聲冷哼從身側(cè)響起焙糟,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稍坯,沒想到半個月后酬荞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡瞧哟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年混巧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勤揩。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡咧党,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陨亡,到底是詐尸還是另有隱情傍衡,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布负蠕,位于F島的核電站蛙埂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏遮糖。R本人自食惡果不足惜绣的,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屡江,春花似錦芭概、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至文黎,卻和暖如春惹苗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背臊诊。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工鸽粉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斜脂,地道東北人抓艳。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像帚戳,于是被迫代替她去往敵國和親玷或。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容