2010-01-26 58 views
6

我目前的工作場所使用標準的Spring/Hibernate/JSP混合來通過XML向Flex客戶端提供內容。訪問數據的方式很多,但最流行的方式是通過對數據庫的直接SQL調用和手動轉換爲XML。Java/Hibernate:如何爲複雜的SQL編寫DAO代碼

麻煩的是,隨着應用程序越來越大,SQL變得越來越複雜,難以維護。就好像維護使用StringBuilders創建的SQL不夠困難,現在更糟糕的是,使用許多if語句和循環動態構建SQL。

我知道通常正確的方法是使用Hibernate查詢和實體獲取項目。但是,在我們的一些請求中,結果不能映射到單個Hibernate實體,我擔心需要使用直接SQL。

什麼是正確的方式去做這件事?有沒有辦法讓動態SQL查詢更清晰?有沒有辦法與Hibernate實體做到這一點?

我很抱歉這個問題的抽象性。我希望你仍然有很好的輸入;)

感謝您的意見!

回答

3

HQL支持獲取多個實體的查詢。聯接也被支持。例如:

SELECT new com.package.model.SearchResultEntry(product, price) FROM Product product, 
    IN(product.variantPrices) price WHERE .... 

上面返回一個新的(非實體!)對象,它由兩個實體 - 產品和價格組成。您也可以使用List來從相同的結果中放入不同的實體。

this tutorial aouourough閱讀。

讓這些查詢與動態參數,並使用最合適的班級將它們存儲爲@NamedQueries

2

您可以考慮將一些SQL邏輯移入數據庫並通過視圖訪問數據:當然會出現它自己的問題(您現在在兩個地方有業務邏輯),但可能值得考慮。

+0

我有點同意,儘管很多人不喜歡SQL中存儲的特效和邏輯。如果您有一個非常複雜的SQL查詢,那麼通過嘗試在代碼中執行操作或使用像HQL這樣的不太健壯的查詢語言,實在沒有辦法簡化它。 – 2010-01-26 22:58:38

0

假設你不能做你的HQL需要什麼看一看ibatis這將允許您設置映射使用特定的SQL查詢和存儲過程。它也將成爲您項目的另一個依賴項,因此也要考慮到這一點。