EasyCriteria –使用JPA Criteria的簡便方法

今天,我們將看到有關此工具的信息,該工具使使用JPA Criteria更加容易。 使用該庫的應用程序將在JPA實現中更加簡潔,易于使用和可移植。

在本文的結尾,您將找到要下載的源代碼。

什么是標準? 當前是創建動態查詢的最佳解決方案。 想象一下一個頁面,該頁面允許用戶執行幾種類型的查詢; 所請求的查詢可以是按名稱,按年齡或二者兼有。 讓我們看一下如果連接一個String時查詢的外觀:

EntityManager em = emf.createEntityManager();
String hql = "select p from Person p where 1=1 ";if(parameters[0].equals("name")){hql += " and p.name = '" + values[0] + "'";
}if(parameters[1].equals("age")){hql += " and p.age = " + values[1];
}TypedQuery<Person> query = em.createQuery(hql, Person.class);System.out.println(query.getResultList());

注意,在上面的代碼中進行了字符串連接; 請記住,這種做法是一種不良和危險的做法,因為它允許“ SQL Injection”黑客攻擊。 為了避免這種攻擊,我們應該使用帶有參數的查詢:

EntityManager em = emf.createEntityManager();
String hql = "select p from Person p where 1=1 ";if(parameters.contains("name")){hql += " and p.name = :name";
}if(parameters.contains("age")){hql += " and p.age = :age";
}TypedQuery<Person> query = em.createQuery(hql, Person.class);if(parameters.contains("name")){query.setParameter("name", values[0].toString());
}if(parameters.contains("age")){query.setParameter("age", Integer.valueOf(values[1].toString()));
}System.out.println(query.getResultList());

注意,SQL注入問題已解決,但是現在代碼必須檢查參數以將其添加到查詢中,并在以后傳遞其值。 代碼需要兩個“參數搜索”來完成任務。

Java / Oracle開發人員在創建適用于這種情況的Criteria概念時有一個絕妙的主意。 在下面,使用本地JPA標準檢查代碼的外觀:

EntityManager em = emf.createEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
Root<Person> root = cq.from(Person.class);
cq.select(root);if(parameters.contains("name")){Path<String> name = root.get("name");cq.where(cb.and(cb.equal(name, values[0])));
}if(parameters.contains("age")){Path<Integer> name = root.get("age");cq.where(cb.and(cb.equal(name, Integer.valueOf(values[1].toString()))));
}TypedQuery<Person> query = em.createQuery(cq);System.out.println(query.getResultList());

有可能看到傳遞參數值更加容易。 無需連接字符串或檢查參數列表值以填充值。

不幸的是,Criteria API過于復雜和冗長。 如果您只想“從人物p中選擇p”,則需要創建以下條件:

EntityManager em = emf.createEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
Root<Person> root = cq.from(Person.class);
cq.select(root);TypedQuery<Person> query = em.createQuery(cq);
System.out.println(query.getResultList());

對許多代碼來說,如此簡單就可以從表中列出所有人。

為了避免所有這些冗長的細節,創建了名為EasyCriteria的開源項目。 如果開發人員使用EasyCriteria,則上面的查詢如下所示:

EntityManager em = emf.createEntityManager();
EasyCriteria<Person> easyCriteria = EasyCriteriaFactory.createQueryCriteria(em, Person.class);if(parameters.contains("name")){easyCriteria.whereEquals("name", values[0]);
}if(parameters.contains("age")){easyCriteria.whereEquals("age", values[1]);
}System.out.println(easyCriteria.getResultList());

請注意,所有JPA詳細信息都已消失。 現在可以使用干凈的代碼,更輕松地創建動態查詢。 關于上面的代碼值得一談:

  • 第2行:通過“工廠”創建EasyCriteria的實例。 該工廠的存在是為了對創建EasyCriteriaImp類型的對象所需的所有陡峭對象進行抽象。 在將來的版本中,將添加新類型的EasyCriteria,例如“ Tuple”。
  • 第5和9行:傳遞參數更容易。 要將參數傳遞給比較值(“ name =:name”),只需使用equals方法,該方法將屬性名稱作為第一個參數。 第二個參數將是等于的值。
  • 第12行:要運行查詢,就不必使用Query界面。 EasyCriteria本身承擔此責任。 可以通過EasyCriteria提取查詢結果。 有兩種方法可用于獲取查詢結果:EasyCriteria.getSingleResult(),EasyCriteria.getResultList()。

在EasyCriteria網頁上,可以找到幾個代碼示例以及可以使用的方法。 EasyCriteria的另一個優點是可以“鏈接”所有方法:

easyCriteria.whereEquals("name", values[0]).whereEquals("age", values[1]).getResultList();

這是一個輕量級的庫,因為唯一的依賴關系是系統將需要的JPA。 注意:您的應用程序將需要啟動并運行JPA實現。

該庫是使用JUnit開發的,并已通過Hibernate,OpenJPA和EclipseLink進行了測試。 JUnit還使用Cobertura框架來檢查測試是否覆蓋了所有代碼行(或其中大部分),到目前為止,我們已覆蓋了100%。

EasyCriteria仍處于Beta版,但開發團隊已經計劃了一些版本和功能。

EasyCriteria的另一個優點是您的軟件代碼不再“耦合”到任何類型的JPA實現中。 今天,Hibernate具有良好的條件工具,但是您的代碼必須保持“附加”狀態。 使用EasyCriteria,您將能夠使用任何一種JPA實現。 這個解耦庫的證明是EasyCriteria已通過前面引用的3種實現進行了測試。

EasyCriteria具有以下方法:in,like,empty和其他。 開發人員將能夠使用Criteria進行連接(只是不帶參數的簡單連接),所有人都可以區分甚至排序。

在這里,您將找到EasyCriteria,可以下載并訪問其所有文檔。

單擊此處下載此帖子的源代碼。

我希望這篇文章/工具可以對您有所幫助。

參考: EasyCriteria –通過 uaiHebert博客的JCG合作伙伴 Hebert Coelho 使用JPA Criteria的簡便方法 。


翻譯自: https://www.javacodegeeks.com/2012/07/easycriteria-easy-way-to-use-jpa.html

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

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

相關文章

語言模擬蒲豐問題_R語言小數定律的保險業應用:泊松分布模擬索賠次數

原文鏈接&#xff1a;拓端數據科技 / Welcome to tecdat?tecdat.cn在保險業中&#xff0c;由于分散投資&#xff0c;通常會在合法的大型投資組合中提及大數定律。在一定時期內&#xff0c;損失“可預測”。當然&#xff0c;在標準的統計假設下&#xff0c;即有限的期望值和獨立…

THINKPHP

路徑 /index.php/home/...一般路徑應用或者U方法轉載于:https://www.cnblogs.com/lidepeng/p/6180631.html

JavaScript下的進制轉換

JavaScript下的進制轉換 //十進制轉其他進制 var num 99; console.log(十進制: , num); console.log(八進制:, (num).toString(8)) console.log(十六進制:, (num).toString(16)) console.log(三十二進制:, (num).toString(32))//其他轉十進制 var x 110; console.log(二進制&…

Spring Security第2部分–密碼加密,自定義404和403錯誤頁面

這是Spring安全站的第二部分。 在這篇文章中&#xff0c;我將向您展示如何使用MD5加密密碼以及自定義403和404狀態代碼錯誤頁面。 如果您尚未閱讀第1部分&#xff0c;請單擊 此處 。 因為我們在這里繼續第1部分項目。 下載已完成的項目&#xff1a; http : //www.mediafire.com…

淺談 PHP 與手機 APP 開發(API 接口開發)

本文內容轉載自:http://www.thinkphp.cn/topic/5023.html 這個帖子寫給不太了解PHP與API開發的人一、先簡單回答兩個問題&#xff1a;1、PHP 可以開發客戶端&#xff1f;答&#xff1a;不可以&#xff0c;因為PHP是腳本語言&#xff0c;是負責完成 B/S架構 或 C/S架構 的S部分&…

獲取人口_「微科普」14億人口數據是如何得到的?

中國經濟交出了2019年終答卷GDP總量近百萬億元人均GDP突破1萬美元……小伙伴們在關心經濟發展的同時也非常關注人口數據14億人口的話題嗖的一下就上了熱搜大家想不想知道14億人口的數據是怎么得到的&#xff1f;我們今天就來科普一下如何獲取人口總量&#xff1f;通常情況下&am…

8.動態規劃(1)——字符串的編輯距離

動態規劃的算法題往往都是各大公司筆試題的常客。在不少算法類的微信公眾號中&#xff0c;關于“動態規劃”的文章屢見不鮮&#xff0c;都在試圖用最淺顯易懂的文字來描述講解動態規劃&#xff0c;甚至有的用漫畫來解釋&#xff0c;認真讀每一篇公眾號推送的文章實際上都能讀得…

更改Java包名稱如何改變我的系統架構

即使只是少量更改角度&#xff0c;也可能對您如何使用系統產生深遠影響。 假設您正在用Java編寫Web應用程序。 在系統中&#xff0c;您處理訂單&#xff0c;客戶和產品。 作為Web應用程序&#xff0c;您的類包括諸如Controller&#xff0c;PersonRepository&#xff0c;Custome…

靜態屬性_Java面試題—內部類和靜態內部類的區別

內部類和靜態內部類的區別內部類&#xff1a;1、內部類中的變量和方法不能聲明為靜態的。2、內部類實例化&#xff1a;B是A的內部類&#xff0c;實例化B&#xff1a;A.B b new A().new B()。3、內部類可以引用外部類的靜態或者非靜態屬性及方法。靜態內部類&#xff1a;1、靜態…

儲存與更新 access_token

做微信的項目&#xff0c;一開始就是 access_token 的申請&#xff0c;微信文檔上寫的比較清楚&#xff1a; 1、為了保密appsecrect&#xff0c;第三方需要一個access_token獲取和刷新的中控服務器。而其他業務邏輯服務器所使用的access_token均來自于該中控服務器&#xff0c;…

Eclipse安裝以及JDK環境變量配置

首先是下載Eclipse&#xff1b;點擊鏈接打開Eclipse官網eclipse官網點擊DownLoad Packages&#xff0c;注意是點擊“DownLoad Packages”點擊你需要的版本開始下載&#xff08;一般是64bit Eclipse IDE&#xff09;等待幾秒鐘&#xff0c;開始下載這樣Eclipse已經下載好了&…

完整的Web應用程序Tomcat JSF Primefaces JPA Hibernate –第1部分

我們創建了這篇文章&#xff0c;將展示如何使用以下工具創建完整的Web應用程序&#xff1a;Tomcat7&#xff0c;帶有Primefaces的JSF2&#xff08;Facelets和Libraries&#xff09;&#xff08;具有AutoComplete&#xff09;&#xff0c;JPA / Hibernate&#xff08;具有NxN關系…

mysql主從架構升級_實戰項目——mysql主從架構的實現

一主一從1.1 環境準備&#xff1a;centos系統服務器2臺、 一臺用戶做Mysql主服務器&#xff0c; 一臺用于做Mysql從服務器&#xff0c; 配置好yum源、 防火墻關閉、 各節點時鐘服務同步、 各節點之間可以通過主機名互相通信1.2 準備步驟&#xff1a;1)iptables -F && s…

FastReport.Net使用:[30]對話框使用

使用對話框需要知道的地方 1.按鈕的DialogResult屬性。 假如DialogResult屬性值為OK的按鈕被點擊&#xff0c;報表將會展現后面的對話框或者報表頁&#xff1b;如果屬性值為None&#xff0c;則停留在當前窗體&#xff1b;如果為其他值&#xff0c;則直接退出報表打印&#xff0…

模擬聊天室顯示語句保持最新顯示

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>模擬聊天室顯示語句保持最新顯示</title> <style> *{ border-collapse: collapse; } .dialog_box{ width:400px; height: 600px; margin…

改善Java EE生產支持技能的8種方法

參與Java EE生產支持的每個人都知道這項工作可能很困難。 7/24傳呼機支持&#xff0c;定期處理的多個事件和錯誤修復&#xff0c;來自客戶和管理團隊的壓力&#xff0c;要求它們盡快解決生產問題并防止再次發生。 在日常工作中&#xff0c;您還必須照顧由多個IT交付團隊驅動的多…

plsql連接mysql_安裝了mysql和pl/sql,怎么配置讓pl/sql能聯接mysql數據庫

64位環境下&#xff0c;使用PL/SQL Developer連接Oracle&#xff1a;?1. 下載32位Oracle InstantClient&#xff0c;并展開到某目錄&#xff0c;例如C:\instantclient-basic-nt-11.2.0.2.0&#xff1b;?2. 將系統的tnsnames.ora拷貝到該目錄下&#xff1b;?3. 在PLSQL Devel…

varnish基礎

varnish概念 初步認識 首先來跟我學習&#xff0c;v~a~r~n~i~s~h~~ &#xff0c;學會了沒有~ 當然還有很重要的一個概念&#xff0c;它是高性能緩存服務器&#xff0c;舉個例子。 好比我們要去買東西&#xff0c;所有的我們需要的東西是在超市廠家生產出來的&#xff0c;我們需…

引入Spring集成

在本文中&#xff0c;我們介紹Spring Integration 。 如果您以前沒有使用過Spring Integration&#xff0c;那么可能會幫助您復習Gregor Hohpe的Enterprise Integration Patterns 。 我還將推薦Josh Long 撰寫的這篇出色的介紹性文章 。 上下文設置 簡而言之&#xff0c; 企業…

PAT 1024. 科學計數法 (20)

科學計數法是科學家用來表示很大或很小的數字的一種方便的方法&#xff0c;其滿足正則表達式[-][1-9]"."[0-9]E[-][0-9]&#xff0c;即數字的整數部分只有1位&#xff0c;小數部分至少有1位&#xff0c;該數字及其指數部分的正負號即使對正數也必定明確給出。 現以科…