2

次の HQL があるとします。

String hql = "select e.aField from MyEntity as e";

MyEntityのメンバー変数の名前をリファクタリングして別の名前に変更したい場合はaField、Strings のコード全体のすべての出現箇所も変更する必要があります。1 つの hql 文字列を変更するのを忘れると、コードが壊れます。

どうすればこれを回避できますか?

4

5 に答える 5

4

NamedQueriesを使用できます。HQLを任意のエンティティの注釈の値として配置し、起動時にSQLにコンパイルします。hqlにエラーがあると、WebAppを起動できなくなります。

于 2009-06-09T10:19:28.557 に答える
2

IntelliJ のように、それを行う方法を知っている十分にスマートな IDE を使用してください。クラスまたは変数の名前を変更すると、IntelliJ がすべての使用を検出し、変更を管理します。

于 2009-06-09T09:44:22.417 に答える
1

私が探していたのと同じものをあなたが探していると思います...そして見つけました!

カスタム Hibernate テンプレートを使用して Java コードを生成しています。私は彼らのコピーを取り、いじり始めました。それはそれよりも恐ろしいように聞こえます-私を信じてください.

PojoFields.ftlファイルに次のコードを追加しました。

// These static property values are being generated by the POJO templates (PojoFields.ftl)
<#foreach field in pojo.getAllPropertiesIterator()>
    <#if pojo.getMetaAttribAsBool(field, "gen-property", true)>    
       <#assign name = pojo.getPropertyName(field) type = pojo.getJavaTypeName(field, jdk5)>
    public static final String ${field.name}_propname = "${field.name}";    
       <#foreach column in field.getColumnIterator()>     
          <#if pojo.getJavaTypeName(field, jdk5) == "String">
    public static final int ${field.name}_len = ${column.getLength()?c}; 
             <#break>                 
          </#if>    
      </#foreach>     
   </#if>   
</#foreach>

すべてのプロパティについて、プロパティ名を持つ public final static String を生成します。

String プロパティの場合、フィールド長を持つ public final static int を生成します。

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";
于 2014-06-08T02:46:33.840 に答える
0

それらは文字列だけなのでできません(定義上リファクタリングするのは難しいです)

于 2009-06-09T09:21:46.143 に答える
0

オプション: 1. HQL の代わりに Criteria を使用する 2. NHibernateToLinq を使用する 3. 各クラスのすべての属性の列挙型を作成し、それを HQL で使用する (連結が必要)

于 2009-06-09T15:50:12.167 に答える