我在一个项目中工作,其中Java实体类是由hibernate工具从db方案生成的。我希望在生成的类中有命名查询,以便能够通过它们的一个非主键字段查找实体。我希望有这样的namedQueries : findUserByName或findUserByHeight。对于这一目的,除了entitymanger.find()和Criteria API之外,命名查询将是一个最佳选择。
我的问题是如何配置hibernate工具/ hbm2java /逆向工程策略来为数据库表中的每一列生成namedQueries。我在网上没有找到任何相应的信息。我希望这是可能的。使用NetBeans中的Eclipse JPA2.0持久性管理器,我能够生成命名查询。
发布于 2010-12-03 00:01:30
如果你使用的是Spring,那么你应该看看Hades。它提供了使用方法名创建SQL语句的功能。您唯一需要做的就是编写一个接口(DAO) --它的实现是由Hades“模拟”的。
所以你可以像这样写一个方法声明:
public interface CustomerDAO {
List<Customer> findByFirstName(String firstName);
}如果方法名-- sql语句映射不适用于复杂的查询,那么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 -我真的很喜欢这个项目
发布于 2010-12-02 23:33:25
恐怕这不是真正的Java风格。
您想要的方法让我想起了Rails和Grails,这两个概念在像Java这样的静态野兽中不能很好地工作(不要误会,我爱我的野兽)。
Spring Roo模仿rails和grails的功能,并生成您想要的控制器方法,但这意味着您必须使用Spring Roo。
另一个想法是使用source code parser对生成的代码进行后处理。但这也将是一个艰难的决定。
最好的办法可能是获得hbm2java工具的代码,并为您的例程添加一个钩子。
发布于 2014-09-14 03:56:12
手动生成那些您真正需要的查询不是更好吗?我有相同的设置,我的pojos和映射是自动生成的,我也希望使用命名查询。
我解决了这个问题,创建了一个新的集中式映射文件,其中包含我所有的命名查询。即使我必须再次执行自动生成REVENG过程,这个查询映射文件也不会被替换,并且仍然有效。
我知道你想做什么。您希望使REVENG自动将命名查询合并到生成的代码/映射中。当我开始使用REVENG时,我也得出了同样的结论。但后来我意识到,REVENG不应该对此负责。相反,它应该从db模式中生成内容。不多也不少。命名查询不是db模式的一部分。所以这里不应该滥用REVENG。
看一看here
https://stackoverflow.com/questions/4336340
复制相似问题