將原生SQL功能休眠到您的Spring Data Repository中

JPA為您提供@NamedNativeQuery以便使用本機SQL。 但是,用法不是很方便,尤其是當您需要在本機SQL中映射多個實體時。 您必須定義一組容易出錯的SqlResultSetMapping映射。

對于以前使用過Hibernate本機SQL功能的用戶,您會發現它比JPA的@NamedNativeQuery更易于使用。 在最近的項目中,我正在使用Spring Data JPA。 我已將休眠的本機查詢功能添加到我的Spring數據庫中。 現在,您可以在JPA中執行本機查詢,而無需使用SqlResultSetMapping。

1.添加您的客戶注釋@NativeQueries和@NativeQuery

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface NativeQueries {NativeQuery[] queries() default  {};
}
@Retention(RetentionPolicy.RUNTIME)
public @interface NativeQuery {String name()  default "";String sql()  default "";
}

2.在基本Spring Data Repository中添加方法“ queryNatively”。

如果您不知道如何向Spring數據JPA基礎存儲庫添加自定義行為,請參閱我以前的文章, 了解如何自定義Spring數據JPA基礎存儲庫 。 您可以在上一篇文章中看到,我有意在GenericRepositoryImpl中公開存儲庫接口(即springDataRepositoryInterface屬性)。 這些小技巧使我可以輕松地訪問存儲庫界面中的注釋。

public List queryNatively(String nativeQueryName, LinkedHashMap<String,Class<?>> inEntityClasses, Map inParams ){SQLQuery query =  this.createHibernateNativeQuery( nativeQueryName,  inParams );//add entitiesif (inEntityClasses!=null) {      for (Object key: inEntityClasses.keySet()) {String entityClassAlias = key.toString();Class<?> entityClass = (Class<?>)inEntityClasses.get(key);  query.addEntity(entityClassAlias,entityClass);}    }//add parameterif (inParams != null){for (Object key: inParams.keySet()) {String queryParamName = key.toString();Object queryParamValue = inParams.get(key);query.setParameter(queryParamName, queryParamValue);}}  return (query!=null)? query.list() : null ;}private SQLQuery createHibernateNativeQuery (String nativeQueryName, Map inParams ){if (GenericRepository.class.isAssignableFrom(getSpringDataRepositoryInterface())) {Annotation nativeQueryAnn = getSpringDataRepositoryInterface().getAnnotation(NativeQueries.class);if(nativeQueryAnn != null){NativeQueries nativeQueries = (NativeQueries)nativeQueryAnn;NativeQuery[] queries  = nativeQueries.queries();for (NativeQuery sqlquery : queries) { if (StringUtils.equals(nativeQueryName, sqlquery.name())) {String sql  = sqlquery.sql();Session hiernateSess = em.unwrap(Session.class);SQLQuery query = hiernateSess.createSQLQuery(sql);//add parameterif (inParams != null){for (Object key: inParams.keySet()) {String queryParamName = key.toString();Object queryParamValue = inParams.get(key);query.setParameter(queryParamName, queryParamValue);}}  return query;}    }}}return null;}

3.示例用法

在存儲庫界面中,通過@NativeQueries和@NativeQuery批注定義要使用的本機SQL查詢。 用法與調用休眠本機查詢功能相似。 您可能只看到休眠別名和屬性引用 。

@NativeQueries (queries = {@NativeQuery(name="query1", sql="SELECT {cat.*}, {mother.*}  FROM CATS c, CATS m WHERE c.MOTHER_ID = c.ID and c.name =  :catName "),@NativeQuery(name="query2", sql="SELECT {cat.*} FROM CATS where c.ID =  :catName")       }
)
public interface CatRepository extends GenericRepository<Cat, Long> {
}

在注入存儲庫的服務或業務類中,您只需簡單地調用queryNatively()方法即可執行本機SQL查詢。

@Service
public class CatService {@Injectprivate CatRepository catRepository;public List<Cat> searchCat( String catName) {List<Cat> catList;// Add entity mapping for your queryHashMap<String, Object> inParams = new HashMap<String, Object>();inParams.put("catName", "Felix");// Prepare parameters for your native sqlLinkedHashMap<String, Object> entityMap = new LinkedHashMap<String, Object>();entityMap.put("cat", Cat.class);entityMap.put("mother",Mother.class);catList = catRepository.queryNatively("query1", "",entityParam);return catList;}
}

參考:來自Programming Peacely博客的JCG合作伙伴 Boris Lam 向您的Spring Data Repository中添加了Hibernate本機SQL功能 。


翻譯自: https://www.javacodegeeks.com/2012/08/hibernate-native-sql-features-into-your.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371606.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371606.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371606.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

創建yii的第一個應用

原文鏈接轉載于:https://www.cnblogs.com/Baronboy/p/6354522.html

字符串匹配(KMP 算法 含代碼)

主要是針對字符串的匹配算法進行解說 有關字符串的基本知識傳統的串匹配法模式匹配的一種改進算法KMP算法網上一比較易懂的解說小樣例1計算next 2計算nextval代碼有關字符串的基本知識 串&#xff08;string或字符串&#xff09;是由零個或多個字符組成的有限序列&#xff0c;一…

php數組轉為js json,javascript-將數組php轉換為JSON時出錯

我在將多維PHP數組轉換為JSON時遇到了一些麻煩.我使用json_encode進行了轉換,但它為null.我正在嘗試開發orgChart,數據是從CSV文件中讀取的,并保存在數組中.布局和JS代碼用于接收JSON文件,因此我需要使用這種格式.這是數組的一部分,其中包含175個數組Array([2] > Array([id]…

UVa 10954 全部相加(Huffman編碼)

https://vjudge.net/problem/UVA-10954 題意&#xff1a;有n個數的集合S&#xff0c;每次可以從S中刪除兩個數&#xff0c;然后把它們的和放回集合&#xff0c;直到剩下一個數。每次操作的開銷等于刪除的兩個數之和&#xff0c;求最小開銷。 思路&#xff1a;Huffman編碼。 1 #…

serialVersionUID的作用以及如何用idea自動生成實體類的serialVersionUID

轉載&#xff1a;http://blog.csdn.net/liuzongl2012/article/details/45168585 serialVersionUID的作用&#xff1a; 通過判斷實體類的serialVersionUID來驗證版本一致性的。在進行反序列化時&#xff0c;JVM會把傳來的字節流中的serialVersionUID與本地相應實體類的serialVer…

js post方式請求另外一個php,利用JS使用POST方式提交請求的方法(結合代碼詳細解答)...

下面是我給大家整理的利用JS使用POST方式提交請求的方法&#xff0c;有興趣的同學可以去看看。一般都是寫上隱藏的form標簽&#xff0c;用來調用js函數然后submit全部用js來寫也行&#xff0c;以下是我在一個問答頻道看見別人寫的例子&#xff0c;放在這里function post(URL, P…

JBoss BRMS最佳實踐– BPM流程初始化層的提示

我過去發布過一些有關遷移策略的文章&#xff0c;仔細研究了流程層&#xff0c;并提供了一些有關jBPM的最佳實踐 &#xff0c;它們都涉及到BPM策略的非常具體的部分。 我想重新討論最佳實踐的主題&#xff0c;然后在智能集成企業級別上&#xff0c;我們討論使用JBoss BRMS對您的…

寒假作業二:匯總隨筆

隨筆一&#xff1a;解題思路隨筆二&#xff1a;自學計劃 轉載于:https://www.cnblogs.com/mercuialC/p/6359997.html

跨站點腳本(XSS)和預防

如OWASP網站&#xff08;https://www.owasp.org/index.php/Cross-site_Scripting_(XSS&#xff09;&#xff09;所述&#xff0c;跨站點腳本&#xff08;XSS&#xff09;攻擊的變種幾乎是無限的。 在這里&#xff0c;我建議使用基于Servlet篩選器的解決方案來清理HTTP請求。 攻…

NoSQL入門第一天——NoSQL入門與基本概述

一、課程大綱 二、入門概述 1.為什么用NoSQL 單機MySQL的年代&#xff1a; 一個網站的訪問量一般都不大&#xff0c;用單個數據庫完全可以輕松應付。      我們來看看數據存儲的瓶頸是什么&#xff1f;        1.數據量的總大小 一個機器放不下時。&#xff08;現…

隨機森林特征個數mtry matlab,基于隨機森林的特征選擇算法

2.1 算法描述本文提出了一種基于隨機森林的Wrapper特征選擇方法RFFS,利用隨機森林算法的變量重要性度量對特征進行排序,然后采用序列后向搜索方法,每次從特征集合中去掉一個最不重要(重要性得分最小)的特征,逐次進行迭代,并計算分類正確率,最終得到變量個數最少、分類正確率最高…

matlab循環讀取變量,Matlab for 多個變量循環能不能這樣啊 ,求教高手!!!!

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓for a0.003:0.0005:1; b0.002:0.0005:0.9; c0.001:0.0005:0.8;d0.0005:0.0005:0.7;E1a* E_Bone;E2b* E_Bone;E3c* E_Bone;E4d* E_Bone;G1a* G_Bone;G2b* G_Bone;G3c* G_Bone;G4d* G_Bone;%% Integration for cortical bone partsIn…

UVA - 10384 The Wall Pusher(推門游戲)(IDA*)

題意&#xff1a;從起點出發&#xff0c;可向東南西北4個方向走&#xff0c;如果前面沒有墻則可走&#xff1b;如果前面只有一堵墻&#xff0c;則可將墻向前推一格&#xff0c;其余情況不可推動&#xff0c;且不能推動游戲區域邊界上的墻。問走出迷宮的最少步數&#xff0c;輸出…

JavaOne 2012:JavaOne技術主題演講

Mark Reinhold從JavaOne 2012技術主題演講開始。 他說&#xff0c;今年的版本將有所不同&#xff0c;因為它將使用大致相同的示例來說明Java的各個方面&#xff0c;而不是對Java的每個組件進行單獨的單獨介紹。 JavaFX團隊的Richard Bair和Jasper Potts &#xff08;并與FXExpe…

C語言結構體及函數傳遞數組參數演示樣例

C語言結構體及函數傳遞數組參數演示樣例 注&#xff1a;makeSphere()函數返回Sphere結構體&#xff0c;main函數中。調用makeSphere()函數&#xff0c;傳遞的第一個參數為數組&#xff0c;傳遞的數組作為指針。posted on 2017-07-30 18:42 mthoutai 閱讀(...) 評論(...) 編輯 收…

Maven內部版本號插件–用法示例

假設我們需要向一些工件&#xff08;jar&#xff0c;war等&#xff09;添加內部版本號。 在這里&#xff0c;我想演示buildnumber-maven-plugin的用法。 這篇文章基于&#xff1a; http://mojo.codehaus.org/buildnumber-maven-plugin/usage.html http://www.site.lalitbhatt…

Python魔法方法(magic method)細解幾個常用魔法方法(下)

接上文&#xff0c;再介紹最后幾個常用的魔法方法。 關于__dict__: 先上個例子&#xff1a; class Test(object):fly Truedef __init__(self, age):self.age age __dict__魔法方法可以被稱為系統&#xff0c;他是存儲各分層屬性的魔法方法。__dict__中&#xff0c;鍵為屬性名…

AIX下RAC搭建 Oracle10G(六)dbca建庫

AIX下RAC搭建系列 AIX下RAC搭建 Oracle10G&#xff08;六&#xff09;dbca建庫 環境 節點 節點1 節點2 小機型號 IBM P-series 630 IBM P-series 630 主機名 AIX203 AIX204 交換機 SAN光纖交換機 存儲 SAN T3存儲 大綱流程例如以下&#xff1a; 第一部分&#xff1…

php string slice,substring()與str.slice()區別

當接收的參數是負數時&#xff0c;slice會將它字符串的長度與對應的負數相加&#xff0c;結果作為參數&#xff1b;substr則僅僅是將第一個參數與字符串長度相加后的結果作為第一個參數&#xff1b;substring則干脆將負參數都直接轉換為0。測試代碼如下&#xff1a;var test h…

JavaOne 2012:掌握Java部署

在吃完一次JavaClass 2012午餐會的意大利經典組合后&#xff0c;我前往希爾頓帝國宴會廳B觀看了演示“掌握Java部署”。 來自Oracle的發言人是Mark Howe和Igor Nekrestyano Howe表示&#xff0c;部署團隊的目標是幫助Java開發人員將其應用程序部署到所選平臺。 他首先討論了“功…