次の HQL があるとします。
String hql = "select e.aField from MyEntity as e";
MyEntity
のメンバー変数の名前をリファクタリングして別の名前に変更したい場合はaField
、Strings のコード全体のすべての出現箇所も変更する必要があります。1 つの hql 文字列を変更するのを忘れると、コードが壊れます。
どうすればこれを回避できますか?
次の HQL があるとします。
String hql = "select e.aField from MyEntity as e";
MyEntity
のメンバー変数の名前をリファクタリングして別の名前に変更したい場合はaField
、Strings のコード全体のすべての出現箇所も変更する必要があります。1 つの hql 文字列を変更するのを忘れると、コードが壊れます。
どうすればこれを回避できますか?
NamedQueriesを使用できます。HQLを任意のエンティティの注釈の値として配置し、起動時にSQLにコンパイルします。hqlにエラーがあると、WebAppを起動できなくなります。
IntelliJ のように、それを行う方法を知っている十分にスマートな IDE を使用してください。クラスまたは変数の名前を変更すると、IntelliJ がすべての使用を検出し、変更を管理します。
私が探していたのと同じものをあなたが探していると思います...そして見つけました!
カスタム 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";
それらは文字列だけなのでできません(定義上リファクタリングするのは難しいです)
オプション: 1. HQL の代わりに Criteria を使用する 2. NHibernateToLinq を使用する 3. 各クラスのすべての属性の列挙型を作成し、それを HQL で使用する (連結が必要)