摘要:的離線查詢對(duì)象用起來的確很是方便,但是其有一個(gè)缺陷通過條件表達(dá)式方法添加的條件會(huì)累加其實(shí)就是存入中的這樣如果要執(zhí)行不同的查詢需要不同的查詢條件時(shí)就需要分別創(chuàng)建不同的離線查詢對(duì)象。
背景hibernate的離線查詢對(duì)象DetachedCriteria用起來的確很是方便,但是其有一個(gè)缺陷:通過·add(條件表達(dá)式)方法添加的條件, 會(huì)累加, 其實(shí)就是存入list中的, 這樣如果要執(zhí)行不同的查詢, 需要不同的查詢條件時(shí), 就需要分別創(chuàng)建不同的離線查詢對(duì)象。
今天碰到的一個(gè)需求中, 一個(gè)Action中對(duì)同一張表連續(xù)查了三次, 每一次用了不同的離線查詢對(duì)象. 感覺優(yōu)點(diǎn)麻煩, 就想看看有沒有對(duì)應(yīng)的方法清除上次用過不想用的條件表達(dá)式. 結(jié)果發(fā)現(xiàn)并沒有, 于是, 就自己通過暴力反射的技術(shù), 寫了一個(gè)小工具方法, 可以實(shí)現(xiàn)清除指定離線查詢對(duì)象中的所有條件表達(dá)式。
通常我們?cè)谑褂秒x線查詢技術(shù)時(shí), 會(huì)這么使用.
如查詢BaseDict對(duì)象對(duì)應(yīng)的表中dictTypeCode=006的記錄.
// 創(chuàng)建離線查詢對(duì)象 DetachedCriteria dc = DetachedCriteria.forClass(BaseDict.class); // 設(shè)置查詢條件 dc.add(Restrictions.eq("dictTypeCode", "006")); // 利用hibernateTemplate模板根據(jù)離線對(duì)象查詢數(shù)據(jù) Listlist = (List ) getHibernateTemplate().findByCriteria(dc);
然而, 當(dāng)我們需要再次查詢BaseDict中dictTypeCode=009的記錄時(shí), 需要重新創(chuàng)建一個(gè)新的DetachedCriteria. 否則, 會(huì)將上次dictTypeCode=006的條件合并起來. 看下圖:
源碼分析DetachedCriteria dc = DetachedCriteria.forClass(BaseDict.class);
==> 調(diào)用構(gòu)造
DetachedCriteria dc = DetachedCriteria.forClass(clazz.getName); // 通過類名構(gòu)建對(duì)象
==>
CriteriaImpl(entityName, ...) // 創(chuàng)建Criteria的實(shí)現(xiàn)類
注意: 這是實(shí)現(xiàn)類會(huì)在離線查詢對(duì)象dc名為"impl"屬性中持有.
進(jìn)入CriteriaImpl會(huì)發(fā)現(xiàn), 原來我們add的所有查詢條件會(huì)保存在一個(gè)叫做:"CriteriaEntries"的ArrayList中, 并且提供了對(duì)應(yīng)公有方法, 返回該list的Iterator迭代器.
經(jīng)過上述分析, 筆者就有思路了:
利用公有方法獲取CriteriaEntries的迭代器, 通過遍歷刪除迭代器中每一個(gè)元素, 即實(shí)現(xiàn)了清空條件的目的.
直接簡(jiǎn)單粗暴, 再次反射, 將dc名為"impl"屬性重置, 即new一個(gè)新的ArrayList賦給它.
代碼實(shí)現(xiàn) 思路一: 獲取迭代器, 遍歷刪除private void eraseCriteria(DetachedCriteria dc) { try { Field impl = dc.getClass().getDeclaredField("impl"); impl.setAccessible(true); // 得到實(shí)現(xiàn)類 CriteriaImpl cimpl = (CriteriaImpl) impl.get(dc); // 思路一: 遍歷criterionEntries, 清空所有 // 利用實(shí)現(xiàn)類的公有方法獲取迭代器 Iterator思路二: 直接重置CriteriaEntriescriterionEntryIterator = cimpl.iterateExpressionEntries(); while (criterionEntryIterator.hasNext()) { // 刪除本元素 criterionEntryIterator.remove(); } } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } Log.end(); }
private void eraseCriteria(DetachedCriteria dc) { try { Field impl = dc.getClass().getDeclaredField("impl"); impl.setAccessible(true); // 得到實(shí)現(xiàn)類 CriteriaImpl cimpl = (CriteriaImpl) impl.get(dc); // 思路二: 再次反射, 直接將criterionEntries置空. // 獲取criterionEntries屬性 Field criterionEntries = cimpl.getClass().getDeclaredField("criterionEntries"); criterionEntries.setAccessible(true); // 重置條件list criterionEntries.set(cimpl, new ArrayList()); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } Log.end(); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/70733.html
一:字典表 字典信息:在項(xiàng)目中可能會(huì)使用到,已經(jīng)存在的一些信息。 例如,客戶的級(jí)別:普通用戶,vip用戶... 客戶的來源:網(wǎng)絡(luò)營(yíng)銷,電話營(yíng)銷... 客戶所屬行業(yè):電子商務(wù),房地產(chǎn)... 客戶的性別:男,女 在保存用戶的時(shí)候,這些信息都是已經(jīng)存在的,不應(yīng)該讓用戶讓用戶來任意填寫, 而是通過下拉列表來讓用戶選擇。 這些已經(jīng)存在的信息稱之為字典信...
一:字典表 字典信息:在項(xiàng)目中可能會(huì)使用到,已經(jīng)存在的一些信息。 例如,客戶的級(jí)別:普通用戶,vip用戶... 客戶的來源:網(wǎng)絡(luò)營(yíng)銷,電話營(yíng)銷... 客戶所屬行業(yè):電子商務(wù),房地產(chǎn)... 客戶的性別:男,女 在保存用戶的時(shí)候,這些信息都是已經(jīng)存在的,不應(yīng)該讓用戶讓用戶來任意填寫, 而是通過下拉列表來讓用戶選擇。 這些已經(jīng)存在的信息稱之為字典信...
摘要:是的簡(jiǎn)稱,運(yùn)行環(huán)境,為的運(yùn)行提供了所需的環(huán)境。分割字符串,返回分割后的字符串?dāng)?shù)組。當(dāng)計(jì)算的值相同時(shí),我們稱之為沖突,的做法是用鏈表和紅黑樹存儲(chǔ)相同的值的。迭代器取代了集合框架中的,迭代器允許調(diào)用者在迭代過程中移除元素。 Java基礎(chǔ)1.JDK和JRE有什么區(qū)別? JDK 是java development kit的簡(jiǎn)稱,java開發(fā)工具包,提供java的開發(fā)環(huán)境和運(yùn)行環(huán)境。JRE 是j...
摘要:此時(shí),我們不能在層使用因?yàn)樗呛徒壎ǖ摹?梢越鉀Q這個(gè)問題,即在層,程序員使用來構(gòu)造查詢條件,然后將這個(gè)作為方法調(diào)用參數(shù)傳遞給業(yè)務(wù)層對(duì)象。而業(yè)務(wù)層對(duì)象獲得之后,可以在范圍內(nèi)直接構(gòu)造,進(jìn)行查詢。參考問題十二投影聚合和分組是的實(shí)例工廠。 問題九、Hibernate里面如何用Criteria 查詢記錄數(shù) 【問題描述】在工作中,有一個(gè)比較復(fù)雜的feature使用的是hibernate的Crite...
閱讀 1272·2021-09-02 13:36
閱讀 2727·2019-08-30 15:44
閱讀 2982·2019-08-29 15:04
閱讀 3200·2019-08-26 13:40
閱讀 3650·2019-08-26 13:37
閱讀 1181·2019-08-26 12:22
閱讀 1021·2019-08-26 11:36
閱讀 1223·2019-08-26 10:41