jpa 与非jpa 结合_EasyCriteria –使用JPA标准的简便方法
jpa 與非jpa 結(jié)合
今天,我們將看到有關(guān)此工具的信息,該工具使使用JPA Criteria更加容易。 使用該庫的應(yīng)用程序?qū)⒃贘PA實(shí)現(xiàn)中更加簡潔,易于使用和可移植。在本文的結(jié)尾,您將找到要下載的源代碼。
什么是標(biāo)準(zhǔn)? 當(dāng)前是創(chuàng)建動(dòng)態(tài)查詢的最佳解決方案。 想象一個(gè)頁面,該頁面允許用戶執(zhí)行幾種類型的查詢; 所請求的查詢可以是按名稱,按年齡或二者兼有。 讓我們看一下如果連接一個(gè)字符串查詢的外觀:
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());注意,在上面的代碼中進(jìn)行了字符串連接; 請記住,這種做法是一種不良和危險(xiǎn)的做法,因?yàn)樗试S“ SQL Injection”黑客攻擊。 為了避免這種攻擊,我們應(yīng)該使用帶有參數(shù)的查詢:
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注入問題已解決,但是現(xiàn)在代碼必須檢查參數(shù)以將其添加到查詢中,并在以后傳遞其值。 代碼需要兩個(gè)“參數(shù)搜索”來完成任務(wù)。
Java / Oracle開發(fā)人員在創(chuàng)建適用于這種情況的Criteria概念時(shí)就有了一個(gè)絕妙的主意。 在下面,使用本地JPA標(biāo)準(zhǔn)檢查代碼的外觀:
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());可能看到傳遞參數(shù)值比較容易。 不需要連接字符串或檢查參數(shù)列表值來填充值。
不幸的是,Criteria API過于復(fù)雜和冗長。 如果您只想“從人物p中選擇p”,則需要?jiǎng)?chuàng)建以下條件:
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());對許多代碼來說,如此簡單就可以從表中列出所有人。
為了避免所有這些冗長的細(xì)節(jié),創(chuàng)建了名為EasyCriteria的開源項(xiàng)目。 如果開發(fā)人員使用EasyCriteria,則上面的查詢?nèi)缦滤?#xff1a;
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詳細(xì)信息都已消失。 現(xiàn)在可以使用干凈的代碼,更輕松地創(chuàng)建動(dòng)態(tài)查詢。 關(guān)于上面的代碼值得一談:
- 第2行:通過“工廠”創(chuàng)建EasyCriteria的實(shí)例。 該工廠的存在是為了對創(chuàng)建EasyCriteriaImp類型的對象所需的所有陡峭對象進(jìn)行抽象。 在將來的版本中,將添加新類型的EasyCriteria,例如“ Tuple”。
- 第5和9行:傳遞參數(shù)更容易。 要將參數(shù)傳遞給比較值(“ name =:name”),只需使用equals方法,該方法將屬性名稱作為第一個(gè)參數(shù)。 第二個(gè)參數(shù)將是等于的值。
- 第12行:要運(yùn)行查詢,就不必使用Query界面。 EasyCriteria本身承擔(dān)此責(zé)任。 可以通過EasyCriteria提取查詢結(jié)果。 有兩種方法可用于獲取查詢結(jié)果:EasyCriteria.getSingleResult(),EasyCriteria.getResultList()。
在EasyCriteria網(wǎng)頁上,可以找到幾個(gè)代碼示例以及可以使用的方法。 EasyCriteria的另一個(gè)優(yōu)點(diǎn)是可以“鏈接”所有方法:
easyCriteria.whereEquals("name", values[0]).whereEquals("age", values[1]).getResultList();這是一個(gè)輕量級的庫,因?yàn)槲ㄒ坏囊蕾囮P(guān)系是系統(tǒng)將需要的JPA。 注意:您的應(yīng)用程序?qū)⑿枰獑?dòng)并運(yùn)行JPA實(shí)現(xiàn)。
該庫是使用JUnit開發(fā)的,并已通過Hibernate,OpenJPA和EclipseLink進(jìn)行了測試。 JUnit還使用Cobertura框架來檢查測試是否覆蓋了所有代碼行(或其中大部分),到目前為止,我們已覆蓋了100%。
EasyCriteria仍處于Beta版,但開發(fā)團(tuán)隊(duì)已計(jì)劃好一些版本和功能。
EasyCriteria的另一個(gè)優(yōu)點(diǎn)是您的軟件代碼不再“耦合”到任何類型的JPA實(shí)現(xiàn)中。 如今,Hibernate具有良好的條件工具,但是您的代碼必須保持“附加”。 使用EasyCriteria,您將能夠使用任何一種JPA實(shí)現(xiàn)。 這個(gè)解耦庫的證明是EasyCriteria已通過前面引用的3種實(shí)現(xiàn)進(jìn)行了測試。
EasyCriteria具有以下方法:in,like,empty和其他。 開發(fā)人員將能夠使用Criteria進(jìn)行連接(只是沒有參數(shù)的簡單連接),所有人都可以區(qū)分甚至排序。
在這里,您將找到EasyCriteria,可以下載并訪問其所有文檔。
單擊此處下載此帖子的源代碼。
我希望這篇文章/工具可以對您有所幫助。
參考: EasyCriteria –通過 uaiHebert博客的JCG合作伙伴 Hebert Coelho 使用JPA Criteria的簡便方法 。
翻譯自: https://www.javacodegeeks.com/2012/07/easycriteria-easy-way-to-use-jpa.html
jpa 與非jpa 結(jié)合
總結(jié)
以上是生活随笔為你收集整理的jpa 与非jpa 结合_EasyCriteria –使用JPA标准的简便方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 马斯克狂喜!特斯拉大涨10% 市值一夜暴
- 下一篇: 美国内华达州发现数千万吨锂矿,预估为全球