2010-12-02 33 views
1

我正在一個項目中使用休眠工具從數據庫方案生成Java實體類。我希望在生成的類中具有命名查詢,以便能夠通過其非主鍵字段之一查找實體。我想要這樣namedQueries:findUserByName或findUserByHeight。除了entitymanger.find()和Criteria API之外,命名查詢將是此目的的最佳選擇。如何通過hibernate生成namedQuery?

我的問題是如何配置hibernate工具/ hbm2java /逆向工程策略,爲db表中的每一列生成namedQueries。我在互聯網上沒有找到任何相應的信息。我希望這是可能的。在NetBeans中使用Eclipse JPA 2.0持久性管理器我能夠生成命名查詢。

回答

0

這恐怕不是Java的風格。

你想讓我想起的方法有RailsGrails,這些概念對於像Java這樣的靜態野獸來說不太合適(不要誤解我的意思,我愛我的野獸)。

Spring Roo模仿rails和grails所做的事情,並生成像你想要的控制器方法,但這意味着你將不得不使用Spring Roo。

另一個想法是通過使用source code parser後處理您生成的代碼。但這也將是一個艱難的呼籲。

可能你最好的選擇是獲取hbm2java工具的代碼併爲你的例程添加一個鉤子。

1

如果您使用的是Spring,那麼您應該看看Hades。它提供了使用方法名稱創建SQL語句的功能。 你需要做的唯一事情就是編寫一個接口(DAO) - 它的實現是由Hades「模擬」的。

所以,你可以做這樣的事情寫一樣的方法聲明:

public interface CustomerDAO { 
    List<Customer> findByFirstName(String firstName); 
} 

如果方法名稱 - SQL statment映射不復雜查詢工作,然後閻王防阻使用在註釋中界定的前瞻性聲明的functionalty。

@Query("FROM Deal as x WHERE customer = :customer AND (x.zombie = 'NONE' OR x.zombie ='NEW')") 
Deal findActiveDealByCustomer(@Param("customer") Customer customer); 

@see http://redmine.synyx.org/projects/show/hades - 我真的很喜歡這個項目

0

豈不是更好手動生成只有那些你真正需要的查詢?我有自動生成的pojos和映射以及希望使用命名查詢的相同設置。

我解決了它,創建一個新的集中映射文件,其中包含我所有的命名查詢。即使我必須再次執行自動生成REVENG過程,該查詢映射文件也不會被替換,並且仍然有效。

我明白你想要做什麼。您想讓REVENG將指定的查詢自動合併到生成的代碼/映射中。從REVENG開始的時候,我也遇到了同樣的問題。但後來我意識到,REVENG不應該對此負責。它應該從db-schema中生成東西。不多也不少。命名查詢不是數據庫模式的一部分。所以REVENG不應該在這裏被濫用。

看一看here