<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    編程生活

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      113 隨筆 :: 0 文章 :: 18 評論 :: 0 Trackbacks

    在這,多次提到使用構造型查詢,主要是我不想取出結果后再轉型,這樣,自己也實在太累了,因此,非常希望讓openJPA一下就將結果做好,畢竟感覺上性能也要好過使用簡單查詢方式。

    I.openJPA的構造型查詢


    openJPA在構造型查詢方面好過其它幾家,它支持三種方式:
    1.通過反射注入,通過setXXX(字段名)注入到目標類(dto對象)的字段中
    2.通過put方法,目標類(dto對象)需實現public void put(Object field, Object value)接口方法,然后openJPA的結果包裝器調用此接口,將數據寫到對象中
    3.通過構造方法,目標類(dto對象)提供所需的構造函數,然后openJPA的結果包裝器通過該構造函數實例化.
    第1種方式最好,第3種方式最差,特別是對于查詢結果比較多,做構造函數簡直就是不可能的事
    用第1種方式,雖然最好,但在openJPA0.9.6,0.9.7及1.0.0中對于使用JPQL這種方式均受到限制,缺省情況下openJPA提供的字段名是jpqlalias1,..,而你的DTO對象不可能定義為jpqlalias1,,這樣的字段,這樣就脫離了業務場景,其它開好人員根本不會用.因此,如果構造型查詢的JPQL如果支持別名,這就太好了.我做了以下修改:

    II.修改方案



    1.修改[openjpa-kernel\src\main\jjtree\org\apache\openjpa\kernel\jpql\JPQL.jjt]


    void constructor_parameter() #CONSTRUCTORPARAM : { }
    {
     (path() | aggregate_select_expression() | string_literal() | numeric_literal()) [LOOKAHEAD(1)<AS>] [LOOKAHEAD(identification_variable())identification_variable()]
    }


    2.修改org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder.java

    private Expression assignProjections(JPQLNode parametersNode,
            QueryExpressions exps) 
    {
            
    int count = parametersNode.getChildCount();
            exps.projections 
    = new Value[count];
            exps.projectionClauses 
    = new String[count];
            exps.projectionAliases 
    = new String[count];

            Expression exp 
    = null;
            
            JPQLNode parentNode 
    = null;
            JPQLNode itemNode 
    = null;
            JPQLNode aliasNode 
    = null;
            String alias 
    = null;

            
    for (int i = 0; i < count; i++{
              parentNode 
    = parametersNode.getChild(i);
              itemNode 
    = firstChild(parentNode);
              aliasNode 
    = parentNode.children.length == 2 ? right(parentNode) : null;
              alias 
    = aliasNode == null ? lastChild(itemNode).text : aliasNode.text;
              exps.projections[i] 
    = getValue(itemNode);
              exps.projectionAliases[i] 
    = alias == null ? nextAlias() : alias;
            }

            
    return exp;
        }



    3.用mvn重新編譯打包,一切ok.

    III.使用示例

    場景:

    /**
    * A實體的一個DTO對象
    */

    public class AData {
        
    private String id;         //標識
        private String type;     //類型
        private String name;    //名稱
        private int cnt;            //子的總數
        
    }


    @Entity
    @Table(..)
    private class A {
        @ID
        @GeneratedValue(generator 
    = "uuid-hex")
        @Column(..)
        
    private String id;
        @Column(..)
        
    private String aName;
        @Column(..)
        
    private String parentID;
        @OneToMany
        @Join..
        
    private List<A> children;
        
    }


    JPQL語法如下:


    select distinct new com.wile.test.AData(a.id, a.aName name, size(a.children) as cnt,'00' type) from A a where a.id=?1

    雖然,我寫的JPQL不太符合規范,但實在是太符合我的要求了.

    posted on 2007-10-26 16:12 wilesun 閱讀(1076) 評論(0)  編輯  收藏 所屬分類: 個人經驗
    主站蜘蛛池模板: 日本亚洲欧美色视频在线播放| 亚洲AV无码一区二区乱子仑| 91在线视频免费91| 美女被免费网站在线视频免费| 国产精品亚洲精品日韩已满| 久久笫一福利免费导航| 人体大胆做受免费视频| 国产成人免费高清激情视频| 亚洲国产美女视频| 最近2022中文字幕免费视频| 亚洲午夜精品一区二区麻豆| 大学生a级毛片免费观看| xxxxxx日本处大片免费看| 亚洲春色另类小说| 亚洲人成影院在线无码观看| 最近2019免费中文字幕6| 一级做a毛片免费视频| 亚洲av无码不卡久久| 久久亚洲国产午夜精品理论片| 青青操免费在线观看| 国产亚洲精品a在线无码| 拨牐拨牐x8免费| 一个人看的www免费视频在线观看| 亚洲色欲色欱wwW在线| 日韩亚洲AV无码一区二区不卡 | 亚洲乱码国产一区网址| 国产一卡2卡3卡4卡2021免费观看 国产一卡2卡3卡4卡无卡免费视频 | 亚洲AV无码一区二区三区牲色 | 久久精品亚洲综合专区| 亚洲精品国产V片在线观看| 无码日韩精品一区二区免费| 久艹视频在线免费观看| 亚洲中文字幕无码av在线| 伊伊人成亚洲综合人网7777| 日本中文字幕免费高清视频| 成年免费a级毛片| 亚洲AV综合色区无码一二三区| 亚洲男人天堂影院| 日美韩电影免费看| 日韩亚洲国产高清免费视频| 久久免费视频99|