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






SELECT SUM(COALESCE(OI.QUANTITY,'0') - COALESCE(0I.CANCEL_QUANTITY)) AS QUANTITY在結(jié)果集包含默認(rèn)值是一個(gè)好的習(xí)慣,否則如果有一項(xiàng)為null,那么最終相減的結(jié)果就也為null了.
操作符可以為任何你當(dāng)前使用數(shù)據(jù)庫(kù)所支持的SQL操作符,比如算術(shù)運(yùn)算符+, -, * 和/ 或者字符串連接符 ||.
你可以增加function=""標(biāo)簽來(lái)完成在complex-alias-field中的min, max, sum, avg, count, count-distinct, upper 及l(fā)ower集合運(yùn)算. 示例, 以上的定義可以用另一種方法表示為:






即為SELECT (SUM(COALESCE(OI.QUANTITY,'0')) - SUM(COALESCE(OI.CANCEL_QUANTITY,'0'))) AS QUANTITY查詢結(jié)果集
* 我討厭OFBiz的實(shí)體引擎,我要自己的JDBC連接!
好的,以下是你獲得JDBC連接的方法:



















你可以查看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
*** 請(qǐng)先考慮以下內(nèi)容: 你放棄數(shù)據(jù)庫(kù)的無(wú)關(guān)性意味著你在某些方法將無(wú)法與框架或其它程序集成.你確定你要這么做嗎?
獲得更好的做法,請(qǐng)?jiān)L問(wèn) http://www.opentaps.org/docs/index.php/Using_the_Query_Tool
* 關(guān)于時(shí)間比較方法的一些警告
在你用 GREATER_THAN比較一個(gè) Timestamp類型數(shù)據(jù)時(shí), 你有可能獲得相同的時(shí)間數(shù)據(jù):

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

* 警告: 在空集合中使用EntityOperator.IN
請(qǐng)小心如果使用EntityOperator.IN去判斷一個(gè)非空集合在一個(gè)空集合中的包含項(xiàng),你有可能獲得一個(gè)語(yǔ)法錯(cuò)誤: 在Derby或者其它一些不為人知的數(shù)據(jù)庫(kù)中可能會(huì)出錯(cuò).
所以建議你能在使用EntityOperator.IN之間,通常執(zhí)行UtilValidate.isNotEmpty方法來(lái)判斷一下結(jié)果集是否為空
* 警告: delegator.getNextSubSeqId 不能確保唯一性
很多實(shí)體有很多合成的主鍵.示例OrderItem's 主鍵是orderId + orderItemSeqId. InventoryItemDetail's 主鍵是inventoryItemId +inventoryItemSeqId. 通常, delegator.getNextSubSeqId 通常是獲得一個(gè)序列值,但是在多線程的訪問(wèn)下有可能無(wú)法確保生成的值的唯一性. 此段內(nèi)容在 http://issues.apache.org/jira/browse/OFBIZ-1636 中有相關(guān)文檔記錄.
當(dāng)前, 如果有可能多個(gè)線程嘗試同時(shí)寫入實(shí)體組合鍵時(shí),可以使用delegator.getNextSeqId來(lái)替代getNextSubSeqId. (此問(wèn)題不會(huì)發(fā)生于OrderItem, 因?yàn)樗皇褂脝尉€程寫入, 但有可能發(fā)生于 InventoryItemDetail, 它使用多線程來(lái)創(chuàng)建庫(kù)存記錄項(xiàng).)
本文檔譯自ofbiz 4.0 cookbooks,本人翻譯,歡迎轉(zhuǎn)載,請(qǐng)注明出處.