我正在一个项目中,通过hibernate工具从db方案生成Java实体类。我希望在生成的类中有命名查询,以便能够通过其非主键字段之一查找实体。我想这样命名为Queries:findUserByName或findUserByHeight。除了entitymanger.find()和Criteria API之外,命名查询将是此目的的最佳选择。
我的问题是如何配置hibernate工具/ hbm2java /逆向工程策略来为db表中的每一列生成namedQueries。我没有在互联网上找到任何相应的信息。我希望这是可能的。在NetBeans中使用Eclipse JPA 2.0 Persistance manager我能够生成命名查询。
答案 0 :(得分:1)
如果您使用的是Spring,那么您应该查看Hades。它提供了从方法名称创建SQL语句的功能。 你唯一需要做的就是编写一个接口(DAO) - 它的实现是由Hades“模拟”的。
所以你可以做类似的方法声明:
public interface CustomerDAO {
List<Customer> findByFirstName(String firstName);
}
如果方法名称 - sql statment映射不适用于复杂查询,那么Hades提供了使用注释中定义的语句的功能。
@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 - 我真的很喜欢那个项目
答案 1 :(得分:0)
这不是Java的风格,我很害怕。
你想让我想起Rails
和Grails
的方法,这些概念对于像Java这样的静态野兽效果不佳(不要误会我的意思,我喜欢我的野兽)。
Spring Roo模仿rails和grails的作用并生成类似你想要的控制器方法,但这意味着你必须使用Spring Roo。
另一个想法是使用source code parser对生成的代码进行后处理。但这也是一个艰难的决定。
可能你最好的办法是获取hbm2java工具的代码并为你的例程添加一个钩子。
答案 2 :(得分:0)
手动生成您真正需要的查询会不会更好?我有相同的设置,我的pojos和映射是自动生成的,也希望使用命名查询。
我解决了这个问题,创建了一个新的集中式映射文件,它保存了我所有的命名查询。即使我必须再次执行自动生成REVENG进程,此查询映射文件也不会被替换,仍然有效。
我明白你想做什么。您希望REVENG将命名查询自动合并到生成的代码/映射中。从REVENG开始,我来到了同一点。但后来我意识到,REVENG不应对此负责。它应该从db-schema中生成东西。不多也不少。命名查询不是db-schema的一部分。所以REVENG不应该在这里被滥用。
看看here: