2009-06-09 2 views
2

다음 HQL을 가지고 있다고 가정 해 보겠습니다. MyEntity Hibernate에서 하드 코드 된 필드 이름들을 피하는 방법?

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

리팩토링하고 MyEntity의 멤버 변수 aField의 이름을 다른 것으로 변경하려면 문자열의 전체 코드에서 모든 항목을 변경해야합니다. . 한 hql 문자열을 변경하는 것을 잊어 버리면 코드가 손상됩니다.

어떻게 이런 일이 일어나지 않도록 할 수 있습니까?

답변

0

당신이 할 수없는 그들이 (정의에 의해 리팩토링하기 어려운) 캐릭터 라인 만

2

사용 인 IntelliJ처럼, 당신을 위해 그것을 할 방법을 알고 충분히 똑똑는 IDE이기 때문에. 클래스 나 변수의 이름을 변경하면 IntelliJ는 모든 사용을 찾아 내고 변경 사항을 관리합니다.

4

NamedQueries을 사용할 수 있습니다. HQL을 어떤 엔티티 에나 주석의 값으로 넣으면 시작시 SQL로 컴파일됩니다. hql에 오류가 있으면 웹 애플리케이션을 시작할 수 없습니다.

0

옵션 : 1. 기준 대신 HQL의 2. NHibernateToLinq HQL을 (연결 필요) 각 클래스에 대한 모든 속성의 열거를 작성하고 당신의 것을 사용 3.

+1

당신은 문자열로 필드 이름이 필요합니다. Restrictions.eq ("fieldname", foo) - 리팩터링과 동일한 문제가 있습니다. – davidsheldon

1

나는 당신을 믿습니다 내가 찾고 있던 똑같은 것을 찾고 ... 찾았 어!

Java 코드를 생성하기 위해 사용자 정의 Hibernate 템플릿을 사용합니다. 나는 방금 그들의 사본을 가져다가 어지럽게 시작했다. 그것은 무서운 것보다 소리가납니다 - 저를 신뢰하십시오.

은 내가 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 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"; 
관련 문제