2015-01-15 3 views
1

약 800 개의 쿼리를 포함하는 HQLquery 파일이 있습니다. 런타임에 발견 된 쿼리와 브라우저에서 전달 된 arguements가 매핑됩니다. 기본적으로 내 코드는 브라우저에서 전달 된 인수를 Long으로 변환합니다. 문제는 일부 bean 클래스에서 변수 (즉, 비교의 왼쪽)가 int이고 일부는 긴 경우입니다. 그러나 런타임에 나는 비교 인수의 왼쪽면의 "유형"을 감지하는 방법을 생각할 수 없다. $int와 long을 비교하는 동안 Hibernate ClassCastException이 발생했습니다.

$ EMPID $ 런타임에 브라우저에서 전달 된 값으로 대체됩니다 e.id = $ EMPID 직원 전자 SELECT * FROM 기본적으로 내 코드는 롱에 전달 된 값을 캐스팅 :

들은 말한다. e.id가 int의 경우, ClassCastException가 슬로우됩니다. 런타임에 e.id의 유형을 감지 할 수있는 방법이 있습니까? 또는이 문제를 해결하기위한 다른 아이디어.

RHS를 Number로 변환하려고 시도했지만 나에게 도움이되었습니다. 어떤 제안이라도 대단히 만족 될 것입니다. 감사합니다

+0

Integer 또는 Long인지 여부에 관계없이 EmployeeEntity의 ID 필드 클래스를 확인하십시오. – StanislavL

+0

hql 쿼리는 등록 정보 파일에서 키 값 쌍으로 정의됩니다. 키는 입력으로 전달되고 값은 문자열 형식의 실제 HQL 쿼리입니다. 함수에 대한 입력은 (NamedQueryKey, ParameterList) 우리는 쿼리를 구문 분석 (피하고자하는)하지 않는 한 런타임에 NamedQueryKey에서 전달 된 쿼리 Bean이 무엇인지 모릅니다. – manish

+0

그런 다음 Long을 사용하도록 모든 엔터티를 다시 작성합니다. ID 열 유형 – StanislavL

답변

2

첫째, 당신은 ClassMetadata에 접근 할 필요가 다음과 같이

ClassMetadata metadata=sessionFactory.getClassMetadata(Employee.class); 

당신은 당신의 HQL 쿼리를 쓰기 :

Number id = ...; 
Type identifierType = metadata.getIdentifierType(); 
Class identifierClass = identifierType.getReturnedClass();         

if(Long.class.equals(identifierClass)) { 
    id = id.longValue(); 
} else { 
    id = id.intValue(); 
} 

session.createQuery("select e from Employee e where e.id = :id") 
    .setParameter("id", id, identifierType) 
    .list(); 

문제를 해결해야 실제 유형을 공급.

관련 문제