1

我正在一个项目中工作,其中 Java 实体类是通过休眠工具从 db 方案生成的。我想在生成的类中命名查询,以便能够通过它们的非主键字段之一找到实体。我想有这样的命名查询:findUserByName 或 findUserByHeight。除了 entitymanger.find() 和 Criteria API 之外,命名查询将是此目的的最佳选择。

我的问题是如何配置休眠工具/hbm2java/逆向工程策略为db表中的每一列生成namedQueries。我在互联网上没有找到任何相应的信息。我希望这是可能的。在 NetBeans 中使用 Eclipse JPA 2.0 持久性管理器,我能够生成命名查询。

4

3 回答 3

1

如果您使用的是 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-02T16:01:30.270 回答
0

仅手动生成您真正需要的那些查询不是更好吗?我有相同的设置,我的 pojo 和映射是自动生成的,也希望使用命名查询。

我解决了这个问题,创建了一个新的集中映射文件,其中包含我所有的命名查询。即使我必须再次执行自动生成 REVENG 过程,此查询映射文件也不会被替换并且仍然有效。

我明白你想要做什么。您想让 REVENG 将命名查询自动合并到生成的代码/映射中。从 REVENG 开始时,我也遇到了同样的问题。但后来我意识到,REVENG 不应该为此负责。它应该从 db-schema 中生成东西。不多也不少。命名查询不是 db-schema 的一部分。所以 REVENG 不应该在这里被滥用。

看看这里

于 2014-09-13T19:56:11.773 回答
0

恐怕这不是真正的 Java 风格。

您想提醒我的方法RailsGrails,不适用于像 Java 这样的静态野兽的概念(不要误会我的意思,我爱我的野兽)。

Spring Roo模仿 rails 和 grails 所做的事情并生成您想要的控制器方法,但这意味着您必须使用 Spring Roo。

另一个想法是使用源代码解析器对生成的代码进行后处理。但这也将是一个艰难的决定。

可能您最好的选择是获取 hbm2java 工具的代码并为您的例程添加一个挂钩。

于 2010-12-02T15:33:24.767 回答