spark的自留地(ofbiz/eclipse rcp/shark/opentaps)

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            54 Posts :: 0 Stories :: 112 Comments :: 0 Trackbacks

          * 如何為SELECT SUM(QUANTITY - CANCEL_QUANTITY) AS QUANTITY之類的語句設置別名 

            <alias entity-alias="OI" name="quantity" function="sum">
                
          <complex-alias operator="-">
                    
          <complex-alias-field entity-alias="OI" field="quantity" default-value="0"/>
                    
          <complex-alias-field entity-alias="OI" field="cancelQuantity" default-value="0"/>
                
          </complex-alias>
            
          </alias> 

             SELECT SUM(COALESCE(OI.QUANTITY,'0') - COALESCE(0I.CANCEL_QUANTITY)) AS QUANTITY在結(jié)果集包含默認值是一個好的習慣,否則如果有一項為null,那么最終相減的結(jié)果就也為null了.
            操作符可以為任何你當前使用數(shù)據(jù)庫所支持的SQL操作符,比如算術(shù)運算符+, -, * 和/ 或者字符串連接符 ||.

            你可以增加function=""標簽來完成在complex-alias-field中的min, max, sum, avg, count, count-distinct, upper 及l(fā)ower集合運算.  示例, 以上的定義可以用另一種方法表示為:

            <alias entity-alias="OI" name="quantity">
                
          <complex-alias operator="-">
                    
          <complex-alias-field entity-alias="OI" field="quantity" default-value="0" function="sum"/>
                    
          <complex-alias-field entity-alias="OI" field="cancelQuantity" default-value="0" function="sum"/>
                
          </complex-alias>
            
          </alias>

             即為SELECT (SUM(COALESCE(OI.QUANTITY,'0')) - SUM(COALESCE(OI.CANCEL_QUANTITY,'0'))) AS QUANTITY查詢結(jié)果集

          * 我討厭OFBiz的實體引擎,我要自己的JDBC連接!
            好的,以下是你獲得JDBC連接的方法: 

          import org.ofbiz.entity.jdbc.ConnectionFactory;

          String helperName 
          = delegator.getGroupHelperName("org.ofbiz");    // gets the helper (localderby, localmysql, localpostgres, etc.) for your entity group org.ofbiz
          Connection conn = ConnectionFactory.getConnection(helperName); 
          Statement statement 
          = conn.createStatement();
          statement.execute(
          "SELECT * FROM PARTY");
          ResultSet results 
          = statement.getResultSet();

          //  通過普通JDBC 的結(jié)果集來操作

          //Alternatively, you can use the SQLProcessor like 
          this:

          SQLProcessor sqlproc 
          = new SQLProcessor(helperName);
          sqlproc.prepareStatement(
          "SELECT * FROM PARTY");
          ResultSet rs1 
          = sqlproc.executeQuery();

          ResultSet rs2 
          = sqlproc.executeQuery("SELECT * FROM PRODUCT");

           你可以查看framework/webtools/webapp/webtools/WEB-INF/actions/entity/EntitySQLProcessor.bsh了解它的使用

          在以下網(wǎng)址你可以獲得相關(guān)JavaDoc的內(nèi)容:
          http://www.opentaps.org/javadocs/version-1.0/framework/api/org/ofbiz/entity/jdbc/SQLProcessor.html
          http://www.opentaps.org/javadocs/version-1.0/framework/api/org/ofbiz/entity/jdbc/ConnectionFactory.html

            *** 請先考慮以下內(nèi)容: 你放棄數(shù)據(jù)庫的無關(guān)性意味著你在某些方法將無法與框架或其它程序集成.你確定你要這么做嗎?

          獲得更好的做法,請訪問 http://www.opentaps.org/docs/index.php/Using_the_Query_Tool


          * 關(guān)于時間比較方法的一些警告

          在你用 GREATER_THAN比較一個 Timestamp類型數(shù)據(jù)時, 你有可能獲得相同的時間數(shù)據(jù): 

          delegator.findByAnd("XXX", UtilMisc.toList(new EntityExpr("fromDate", EntityOperator.GREATER_THAN, "2007-12-31 23:59:59.998")));

           有可能包含fromDate=2007-12-31 23:59:59.998的數(shù)據(jù).  (此種情況發(fā)生于PostgreSQL 8.1并且GenericDAO 類生成的SQL代碼是'FROM_DATE > ' so 所以我也不明白發(fā)生這個問題的原因.) 所以確保安全的方法是, 增加1秒到需要比較的時間中然后使用 GREATER_THAN_EQUAL_TO方法  

          delegator.findByAnd("XXX", UtilMisc.toList(new EntityExpr("fromDate", EntityOperator.GREATER_THAN_EQUAL_TO, "2008-01-01 00:00:00.998")));

           

          * 警告: 在空集合中使用EntityOperator.IN

          請小心如果使用EntityOperator.IN去判斷一個非空集合在一個空集合中的包含項,你有可能獲得一個語法錯誤: 在Derby或者其它一些不為人知的數(shù)據(jù)庫中可能會出錯.
          所以建議你能在使用EntityOperator.IN之間,通常執(zhí)行UtilValidate.isNotEmpty方法來判斷一下結(jié)果集是否為空

          * 警告: delegator.getNextSubSeqId 不能確保唯一性

          很多實體有很多合成的主鍵.示例OrderItem's 主鍵是orderId + orderItemSeqId.  InventoryItemDetail's 主鍵是inventoryItemId +inventoryItemSeqId.  通常, delegator.getNextSubSeqId 通常是獲得一個序列值,但是在多線程的訪問下有可能無法確保生成的值的唯一性.  此段內(nèi)容在 http://issues.apache.org/jira/browse/OFBIZ-1636 中有相關(guān)文檔記錄.

          當前, 如果有可能多個線程嘗試同時寫入實體組合鍵時,可以使用delegator.getNextSeqId來替代getNextSubSeqId.  (此問題不會發(fā)生于OrderItem, 因為它只使用單線程寫入, 但有可能發(fā)生于 InventoryItemDetail, 它使用多線程來創(chuàng)建庫存記錄項.)
           

          完>>

          本文檔譯自ofbiz 4.0 cookbooks,本人翻譯,歡迎轉(zhuǎn)載,請注明出處.
          posted on 2008-10-26 11:30 shanghai_spark 閱讀(1609) 評論(0)  編輯  收藏 所屬分類: opentaps
          主站蜘蛛池模板: 美姑县| 德清县| 枣庄市| 收藏| 高雄市| 八宿县| 德江县| 凤翔县| 于都县| 阳山县| 卓尼县| 靖宇县| 萝北县| 铜陵市| 腾冲县| 图木舒克市| 广元市| 平泉县| 泗洪县| 五原县| 普兰店市| 孟连| 威远县| 奉化市| 营山县| 滨州市| 金湖县| 金平| 莱州市| 贵州省| 四平市| 九龙县| 镶黄旗| 吉首市| 奎屯市| 滦平县| 武平县| 陆丰市| 岑巩县| 五华县| 仁寿县|