編程生活

             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            113 隨筆 :: 0 文章 :: 18 評論 :: 0 Trackbacks
          openJPA的0.9.7和1.0.0的構(gòu)造型查詢均不支持distinct,但如果不使用構(gòu)造型方式查詢又支持distinct,最后檢查JPQLExpressionBuilder.java的evalSelectClause(..)方法,發(fā)現(xiàn)是openJPA中的問題,我將其修改為:
          private Expression evalSelectClause(QueryExpressions exps) {
                  
          if (exps.operation != QueryOperations.OP_SELECT)
                      
          return null;

                  JPQLNode selectNode 
          = root();

                  JPQLNode constructor 
          = selectNode.findChildByID(JJTCONSTRUCTOR, true);
                  
          if (constructor != null{
                      
          // build up the fully-qualified result class name by
                      
          // appending together the components of the children
                      String resultClassName = assemble(left(constructor));
                      exps.resultClass 
          = resolver.classForName(resultClassName, null);

                      
          // now assign the arguments to the select clause as the projections
                      JPQLNode selectClause = selectNode.findChildByID(JJTSELECTCLAUSE, false);
                      
          if (selectClause != null && selectClause.hasChildID(JJTDISTINCT))
                        exps.distinct 
          = exps.DISTINCT_TRUE | exps.DISTINCT_AUTO;
                      
          else
                        exps.distinct 
          = exps.DISTINCT_FALSE;
                      
                      
          return assignProjections(right(constructor), exps);
                  }
           else {
                      JPQLNode selectClause 
          = selectNode.
                          findChildByID(JJTSELECTCLAUSE, 
          false);
                      
          if (selectClause != null && selectClause.hasChildID(JJTDISTINCT))
                          exps.distinct 
          = exps.DISTINCT_TRUE | exps.DISTINCT_AUTO;
                      
          else
                          exps.distinct 
          = exps.DISTINCT_FALSE;

                      
          // handle SELECT clauses
                      JPQLNode expNode = selectNode.
                          findChildByID(JJTSELECTEXPRESSIONS, 
          true);
                      
          if (expNode == null)
                          
          return null;

                      
          int selectCount = expNode.getChildCount();
                      JPQLNode selectChild 
          = firstChild(expNode);

                      
          // if we are selecting just one thing and that thing is the
                      
          // schema's alias, then do not treat it as a projection
                      if (selectCount == 1 && selectChild != null &&
                          selectChild.getChildCount() 
          == 1 &&
                          onlyChild(selectChild) 
          != null &&
                          assertSchemaAlias().
                              equalsIgnoreCase(onlyChild(selectChild).text)) 
          {
                          
          return null;
                      }
           else {
                          
          // JPQL does not filter relational joins for projections
                          exps.distinct &= ~exps.DISTINCT_AUTO;
                          
          return assignProjections(expNode, exps);
                      }

                  }

              }

          使用方式為:
          select DISTINCT new com.wile.test.AData(a.id, a.name,..) from A where a.id=?1
          目前已向openJPA提出此bug(bug-id:OPENJPA-420),希望他們能在1.0.1中進(jìn)行修改
          posted on 2007-10-26 15:48 wilesun 閱讀(1121) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 鹿泉市| 凤阳县| 上饶县| 敖汉旗| 遂川县| 进贤县| 安龙县| 孟津县| 张家港市| 历史| 嘉峪关市| 泰安市| 夹江县| 定襄县| 龙门县| 安福县| 康乐县| 南昌县| 泸西县| 社会| 醴陵市| 阿尔山市| 绵阳市| 凯里市| 汉阴县| 聂拉木县| 库尔勒市| 北票市| 安泽县| 都兰县| 崇礼县| 积石山| 子长县| 措勤县| 会同县| 六安市| 姜堰市| 高雄市| 监利县| 阿坝| 北碚区|