Как избежать жестко заданных имен полей в HQL, Hibernate? - PullRequest
2 голосов
/ 09 июня 2009

Предположим, у меня есть следующий HQL:

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

Если я хочу провести рефакторинг и изменить имя переменной-члена MyEntity aField на что-то другое, я также должен изменить все вхождения во всем коде в строках. Если я забуду изменить одну строку hql, код обрывается.

Как я могу избежать этого?

Ответы [ 5 ]

4 голосов
/ 09 июня 2009

Вы можете использовать NamedQueries - вы ставите HQL в качестве значения аннотации для любой сущности, и они компилируются в SQL во время запуска. если у вас есть какие-либо ошибки в hql, вы не сможете запустить свое WebApp.

2 голосов
/ 09 июня 2009

Используйте IDE, которая достаточно умна, чтобы знать, как сделать это для вас, например, IntelliJ. Если я переименую класс или переменную, IntelliJ находит каждое использование и управляет изменением для меня.

1 голос
/ 08 июня 2014

Я полагаю, вы ищете то же самое, что я искал ... и нашел!

Я использую собственные шаблоны 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>

Для всех свойств генерируется общедоступная конечная статическая строка с именем свойства.

Для свойств String генерируется общедоступное конечное статическое int с длиной поля.

public static final String  postalCode_propname         = "postalCode";
public static final int     postalCode_len              = 15;

Пока я всегда использую эти статические переменные и никогда не кодирую их значения жестко, я буду избегать ошибок RunTime, связанных с изменением структуры базы данных.

Примеры:

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";
0 голосов
/ 09 июня 2009

Варианты: 1. Используйте критерии вместо HQL 2. Используйте NHibernateToLinq 3. создайте перечисление всех ваших атрибутов для каждого класса и используйте его в вашем HQL (требуется объединение)

0 голосов
/ 09 июня 2009

вы не можете, так как они являются только строками (трудно по рефакторингу по определению)

...