如何避免HQL、Hibernate中硬编码的字段名?

如何避免HQL、Hibernate中硬编码的字段名?,hibernate,refactoring,hql,hard-coding,Hibernate,Refactoring,Hql,Hard Coding,假设我有以下HQL: String hql = "select e.aField from MyEntity as e"; 如果我想重构并将MyEntity的成员变量aField的名称更改为其他名称,我还必须更改整个代码中出现的所有字符串。如果我忘记更改一个hql字符串,代码就会中断 如何避免这种情况发生?你不能,因为它们只是字符串(定义上很难重构)使用一个足够聪明的IDE,知道如何为你做,比如IntelliJ。如果我重命名一个类或变量,IntelliJ会为我找到所有的用法并管理更改。您可以使

假设我有以下HQL:

String hql = "select e.aField from MyEntity as e";
如果我想重构并将
MyEntity
的成员变量
aField
的名称更改为其他名称,我还必须更改整个代码中出现的所有字符串。如果我忘记更改一个hql字符串,代码就会中断


如何避免这种情况发生?

你不能,因为它们只是字符串(定义上很难重构)

使用一个足够聪明的IDE,知道如何为你做,比如IntelliJ。如果我重命名一个类或变量,IntelliJ会为我找到所有的用法并管理更改。

您可以使用-您将HQL作为任何实体上的注释值,并在启动时将它们编译为SQL。如果hql中有任何错误,您将无法启动Web应用程序。

选项: 1.使用标准而不是HQL 2.使用NHibernateToLinq
3.为每个类创建一个所有属性的枚举,并在HQL中使用它(需要连接)

我相信您正在寻找与我一样的东西。。。找到了

我使用自定义Hibernate模板生成Java代码。我只是拿了一份他们的,然后开始胡闹。这听起来比实际情况更可怕——相信我

我在PojoFields.ftl文件中添加了以下代码:

只要我总是使用这些静态变量,并且从不硬编码它们的值,我就可以避免与数据库结构更改相关的运行时错误

示例:

Criteria criteria = session.createCriteria(ClPost.class).add(
            Restrictions.ne(ClPost.postalCode_propname, "90210"));

String hql = "select e." + ClPost.postalCode_propname 
    + " from " + ClPost.class.getSimpleName() + " as e";

使用条件时,还需要将字段名作为字符串。eq(“fieldname”,foo)-这与重构有同样的问题。
public static final String  postalCode_propname         = "postalCode";
public static final int     postalCode_len              = 15;
Criteria criteria = session.createCriteria(ClPost.class).add(
            Restrictions.ne(ClPost.postalCode_propname, "90210"));

String hql = "select e." + ClPost.postalCode_propname 
    + " from " + ClPost.class.getSimpleName() + " as e";