2011-12-04 2 views
2

Hibernate를 사용하여 저장 프로 시저를 호출하는 방법을 설명하는 예제가 많이 있지만, Spring을 사용할 때 그림이 약간 변경됩니다.Hibernate와 Spring을 사용하여 저장 프로 시저 호출하기

내가 전화를 걸 MySQL은 저장 프로 시저를 가지고 : SQL에서 나는 다음과 같은 작성해야 :

스프링
CALL inrange(32.342324,32.234234); 
It returns a row with the following: `{INT},{INT},{FLOAT}` 

, 나는 최대 절전 모드 작업을 실행하는 HibernateTemplate 방법을 사용하여, 나는 알고 여러분 중 일부는 그것을 좋아하지 않을 것입니다. 그러나 이것은 제가 시작했을 때 프로젝트가 어떻게 이루어 졌는지, 그리고 아마도 미래에 아마도 그렇게 바뀌지는 않을 것입니다 ...

현재 다음 코드가 있습니다. 프로 시저를 호출하려고 시도하는 Java :

내가 그것을 실행하면
List<Object[]> resultset = hibernateTemplate 
           .findByNamedQuery("inrange", 
            person.getAddress().getLatitude(), 
            person.getAddress().getLongitude()); 

, 나는 다음과 같은 최대 절전 모드 예외가 :

org.springframework.orm.hibernate3.HibernateSystemException: 
    Named query not known: inrange; 

나는 이것이 내가 최대 절전 모드에서 저장 프로 시저를 선언하지 않은 사실 듀오 일어나고 있다고 생각. 내 질문 :

  • 신고 방법은 무엇입니까?
  • Spring의 응용 프로그램 컨텍스트 파일에서이를 선언하는 특별한 방법이 있습니까?

답변

4

최대 절전 모드에서 원시 SQL 쿼리를 호출 할 수 있습니다. 이 링크에서

봐 : Btw은 당신이 단순히 스프링의 JdbcTemplate을 사용할 수있는 저장 프로 시저를 호출 할 경우 http://www.mkyong.com/hibernate/how-to-call-store-procedure-in-hibernate/

.최대 절전 모드 확장은 여러분의 필요에 들어갈 수

주의 사항 : http://www.hibernatespatial.org/

+0

Hibernatepatial은 매우 멋지지만 mySQL을 사용하고 있습니다. 기능의 대부분은 해당 DB, 특히 거리 함수에서 지원되지 않습니다. – stdcall

+0

실제로 각 DB는 고유 한 기능/기능을 제공하며 아마도이 프로젝트에 기여하여 MySQL에서도 작동합니다. 행운을 빕니다 –

3

당신은 Hibernate의 이름 붙여진 쿼리를 MySQL의 저장 프로 시저와 혼동하고 있습니다.

MySQL 저장 프로 시저를 호출하려는 경우 Hibernate의 API를 통해 그렇게하는 것이 도움이되지 않습니다. 나는 Spring의 JdbcTemplate을 사용하여 쿼리를 수행 할 것을 권한다. 당신이 절대적으로 최대 절전 모드를 사용해야하는 경우

,이 같은 작업을해야합니다 :

SQLQuery query = hibernateTemplate.getCurrentSession() 
    .createSQLQuery("SELECT inrange(:latitude, :longitude)"; 
query.setDouble("latitude", ...); 
query.setDouble("longitude", ...); 
List<Object[]> result = query.list(); // requires casting for generics 
+0

내가 혼란 아니에요은 조금 구글 당신은 내가 가리키는있어 손쉽게 찾을 수 있습니다. – stdcall

3

당신은 당신의 Hibernate 매핑 파일에 명명 된 쿼리를 추가해야합니다.

하이버 네이트 매핑 파일을 공유 할 수 있습니까? 약간의 샘플 here을 찾을 수 있습니다.

이전 링크와 함께 this까지 갈 수 있습니다.

POJO, 최대 절전 모드 매핑 및 사용중인 절차를 공유하는 것이 더 쉬울 것입니다.

This blog 당신에게 도움이 될 것입니다. getHibernateTemplate().execute(HibernateCallback) 방법을 사용하는 데 문제가 없기를 바랍니다.

+0

실제로, 나는 Hibernate 매핑 파일을 가지고 있지 않다. 최대 절전 모드 매핑을 위해 Spring의 컨텍스트 XML 및 주석을 사용하고 있습니다. 도움이된다면 스프링 구성을 게시 할 수 있습니다. – stdcall

+0

POJO 수업을 공유 할 수 있습니까? –

+0

저장 프로 시저의 결과 집합 인 pojo는 pojo에 매핑되지 않고 모든 스칼라입니다. – stdcall