我的團隊正在開發一個廣泛查詢MySQL數據庫(在不同的類和模塊中)的大型java應用程序。 我想知道是否有一種模式,允許我在編譯時通知是否有引用錯誤表結構的查詢(例如,如果我刪除或添加表中的字段,查詢字符串引用到它),以防止運行時錯誤。 這也適用於JOIN查詢。編譯時發現不安全/錯誤查詢的模式
回答
有一個名爲DODS(數據對象設計工作室)的開源工具,可以做你想做的事情。 DODS工具最初是Enhydra Java應用服務器項目的一部分,並且自2002年支持該項目的公司支持kablooey以來,DODS已在ObjectWeb中託管和維護。無論如何,它是開源的(LGPL)。
http://forge.objectweb.org/projects/dods
的概念是,你描述XML文件的架構和DODS產生,使用它可以查詢和操作數據庫表Java POJO類。當然,每次更改模式時,都需要再次運行DODS以重新生成ORM類,並針對它們重新編譯應用程序。
但結果是,如果表或列消失,並且您的應用程序正在查詢不再存在的數據庫元數據,則會發生編譯時錯誤,因爲您的代碼現在調用相應的類或方法更長的存在。
我會說簡單的答案是「不」。更完整的答案是「是的,在某種程度上」,取決於你是否願意跳過籃球。
除非您有數據庫模式的java表示,否則如果查詢錯誤(可以生成這些類),將永遠無法獲得編譯時間通知。此外,您必須使用這些類來構建查詢,因此必須放棄您今天使用的方法(查詢字符串)。爲了能夠使用java類來構建查詢,您還必須使用技巧。 LiquidForm使用所需的技巧來構建JPA查詢,但是我沒有看到用於構建SQL查詢的類似庫(LiquidForm是新的和相當出色的)。你實際上必須自己建立一個類似的庫。所以,正如你所看到的,在構建SQL時獲得編譯時警告是困難的,但並非不可能(只是幾乎不可能)。但即使您應該能夠創建我所建議的內容,您的Java架構表示必須在模式更改後立即更新,因此必須將Java類的生成內置到您的IDE或構建工具中。
我建議你寧願有良好的單元測試,當你的查詢由於模式改變而變得非法時,它會發現。這是實現你想要的最常見的方式。另外,如果你決定「升級」到JPA,你可以使用LiquidForm來獲得你想要的。
Querydsl與LiquidForm類似,支持基於JPA/Hibernate和SQL的後端。
對於基於SQL的版本,我們目前支持MySQL(5.?測試),Oracle(10g測試)和HSQLDB。
簡而言之查詢這樣
select count(*) from test where name = null
將成爲
long count = query.from(test).where(test.name.isnull()).count();
Querydsl SQL使用代碼生成,以反映SQL模式到Java類。
- 1. 發佈模式下的編譯錯誤
- 2. 編譯錯誤/查詢
- 3. 添加引用時沒有編譯錯誤,但在編譯時發現錯誤
- 4. 模式編譯錯誤
- 5. Angular2在使用prod模式時出現編譯錯誤
- 6. Play Framework中的安全模塊:編譯錯誤:類型檢查已經定義
- 7. maven安裝時的Maven編譯錯誤
- 8. pip3安裝scipy時的編譯錯誤
- 9. 編譯庫時出現「編譯時出現不同版本」錯誤
- 10. C++模板化類型檢查編譯時線程安全嗎?
- 11. 編譯錯誤,subliminal.h沒有發現
- 12. LockWorkStation - 編譯錯誤 - 標識未發現
- 13. PHP的問題 - 設置時區時的安全模式錯誤
- 14. 查詢時發生錯誤:
- 15. 鏈接全局數組結構時出現編譯錯誤
- 16. 在發佈模式下編譯時出現奇怪的結果
- 17. 發送查詢時出現Sequelize錯誤錯誤:讀取ECONNRESET
- 18. 獲取錯誤「發出的值,而不是編譯模板時的錯誤實例」,而實現vue表
- 19. PHPLIST - 在安全模式= Off時發送消息時出錯
- 20. Java RMI的教程編譯時錯誤 - 接口未發現
- 21. cs50 pset1 water.c編譯時出現錯誤
- 22. 在ld86編譯時出現auto_start錯誤
- 23. 編譯時出現XMLSerializer錯誤
- 24. 編譯時出現ASP.Net 4.5錯誤
- 25. 編譯代碼時出現LNK2019錯誤
- 26. 在Xcode編譯時出現錯誤
- 27. 編譯文件時出現C++錯誤
- 28. 編譯時出現許多錯誤opencv_contrib
- 29. 編譯示例時出現DirectXTK錯誤
- 30. 編譯時出現jsoncpp致命錯誤