2008-12-16 63 views
1

我的團隊正在開發一個廣泛查詢MySQL數據庫(在不同的類和模塊中)的大型java應用程序。 我想知道是否有一種模式,允許我在編譯時通知是否有引用錯誤表結構的查詢(例如,如果我刪除或添加表中的字段,查詢字符串引用到它),以防止運行時錯誤。 這也適用於JOIN查詢。編譯時發現不安全/錯誤查詢的模式

回答

0

有一個名爲DODS(數據對象設計工作室)的開源工具,可以做你想做的事情。 DODS工具最初是Enhydra Java應用服務器項目的一部分,並且自2002年支持該項目的公司支持kablooey以來,DODS已在ObjectWeb中託管和維護。無論如何,它是開源的(LGPL)。

http://forge.objectweb.org/projects/dods

的概念是,你描述XML文件的架構和DODS產生,使用它可以查詢和操作數據庫表Java POJO類。當然,每次更改模式時,都需要再次運行DODS以重新生成ORM類,並針對它們重新編譯應用程序。

但結果是,如果表或列消失,並且您的應用程序正在查詢不再存在的數據庫元數據,則會發生編譯時錯誤,因爲您的代碼現在調用相應的類或方法更長的存在。

0

我會說簡單的答案是「不」。更完整的答案是「是的,在某種程度上」,取決於你是否願意跳過籃球。

除非您有數據庫模式的java表示,否則如果查詢錯誤(可以生成這些類),將永遠無法獲得編譯時間通知。此外,您必須使用這些類來構建查詢,因此必須放棄您今天使用的方法(查詢字符串)。爲了能夠使用java類來構建查詢,您還必須使用技巧。 LiquidForm使用所需的技巧來構建JPA查詢,但是我沒有看到用於構建SQL查詢的類似庫(LiquidForm是新的和相當出色的)。你實際上必須自己建立一個類似的庫。所以,正如你所看到的,在構建SQL時獲得編譯時警告是困難的,但並非不可能(只是幾乎不可能)。但即使您應該能夠創建我所建議的內容,您的Java架構表示必須在模式更改後立即更新,因此必須將Java類的生成內置到您的IDE或構建工具中。

我建議你寧願有良好的單元測試,當你的查詢由於模式改變而變得非法時,它會發現。這是實現你想要的最常見的方式。另外,如果你決定「升級」到JPA,你可以使用LiquidForm來獲得你想要的。

1

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類。