国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

利用反射清空hibernate離線查詢對(duì)象中的所有條件

Bmob / 1289人閱讀

摘要:的離線查詢對(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ù)
List list = (List) getHibernateTemplate().findByCriteria(dc);

然而, 當(dāng)我們需要再次查詢BaseDictdictTypeCode=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 criterionEntryIterator = cimpl.iterateExpressionEntries();
            while (criterionEntryIterator.hasNext()) {
                // 刪除本元素
                criterionEntryIterator.remove();
            }
        
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        Log.end();
        
    }

思路二: 直接重置CriteriaEntries
    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

相關(guān)文章

  • ssh框架整合案例(字典表,no-session,hebiernate|模板的api,懶加載,級(jí)聯(lián)刪

    一:字典表 字典信息:在項(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)存在的信息稱之為字典信...

    dkzwm 評(píng)論0 收藏0
  • ssh框架整合案例(字典表,no-session,hebiernate|模板的api,懶加載,級(jí)聯(lián)刪

    一:字典表 字典信息:在項(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)存在的信息稱之為字典信...

    lufficc 評(píng)論0 收藏0
  • 超實(shí)用百道Java面試題

    摘要:是的簡(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...

    MkkHou 評(píng)論0 收藏0
  • Hibernate之DetachedCriteria、Criteria

    摘要:此時(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...

    Moxmi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<