2010-03-05 3 views
0

내 기본 쿼리가 올바르게 작동합니다. oracle sqlplus. 그러나 JPA 기본 쿼리를 통해 제공 오류 다음JPA + Hibernate + Native Query + 결과 집합의 dtos의 사용자 정의 목록

[ERROR] org.hibernate.util.JDBCExceptionReporter - ORA-00923 :

을 예상 한 위치에 FROM 키워드를 찾을 수 없습니다

기본 쿼리


SELECT sch.school_name, term.term_name, count(material.MATERIAL_ID), sip.SIP_COUNT, ... FROM VA_SCHOOL sch JOIN va_user_school_rel usr1 on sch.school_id=usr1.school_id 

JOIN va_user ur ON usr1.USER_ID= ur.USER_ID 
JOIN va_user_role_rel urr1 on usr1.user_id=urr1.user_id 
JOIN va_role rle ON urr1.role_id= rle.role_id 
JOIN va_user_school_rel usr2 on sch.school_id=usr2.school_id 
JOIN va_user ur1 ON usr2.USER_ID= ur1.USER_ID 
JOIN va_user_role_rel urr2 on usr2.user_id=urr2.user_id 
JOIN va_role rle1 ON urr2.role_id= rle1.role_id 
JOIN va_term term on term.school_id = usr1.school_id 
JOIN va_class course on course.term_id = term.term_id 
JOIN va_material material on material.class_id = course.class_id 
LEFT JOIN (SELECT VA_CLASS.TERM_ID TERM_ID, COUNT(*) as SIP_COUNT FROM VA_CLASS JOIN VA_MATERIAL ON VA_MATERIAL.CLASS_ID = VA_CLASS.CLASS_ID WHERE VA_CLASS.reference_flag = 'A' AND trunc(VA_MATERIAL.SCHOOL_STATUS) = 0 GROUP BY VA_CLASS.TERM_ID) sip on term.term_id = sip.term_id 

WHERE course.reference_flag = 'A' AND rle.role_name='ROLE_1' AND rle1.role_name='ROLE_2' 

GROUP BY sch.school_name, term.term_name, sip.SIP_COUNT 
ORDER BY sch.school_name, term.term_name 

JPA 기본 검색어 :


SELECT new MyDTO(sch.school_name, term.term_name, count(material.MATERIAL_ID), sip.SIP_COUNT, ...) FROM VA_SCHOOL sch 
JOIN va_user_school_rel usr1 on sch.school_id=usr1.school_id 
JOIN va_user ur ON usr1.USER_ID= ur.USER_ID 
JOIN va_user_role_rel urr1 on usr1.user_id=urr1.user_id 
JOIN va_role rle ON urr1.role_id= rle.role_id 
JOIN va_user_school_rel usr2 on sch.school_id=usr2.school_id 
JOIN va_user ur1 ON usr2.USER_ID= ur1.USER_ID 
JOIN va_user_role_rel urr2 on usr2.user_id=urr2.user_id 
JOIN va_role rle1 ON urr2.role_id= rle1.role_id 
JOIN va_term term on term.school_id = usr1.school_id 
JOIN va_class course on course.term_id = term.term_id 
JOIN va_material material on material.class_id = course.class_id 

LEFT JOIN (SELECT VA_CLASS.TERM_ID TERM_ID, COUNT(*) as SIP_COUNT FROM VA_CLASS JOIN VA_MATERIAL ON VA_MATERIAL.CLASS_ID = VA_CLASS.CLASS_ID WHERE VA_CLASS.reference_flag = 'A' AND trunc(VA_MATERIAL.SCHOOL_STATUS) = 0 GROUP BY VA_CLASS.TERM_ID) sip on term.term_id = sip.term_id 

WHERE course.reference_flag = 'A' AND rle.role_name=:p_roleName AND rle1.role_name=:p_roleName1 

GROUP BY sch.school_name, term.term_name, sip.SIP_COUNT 
ORDER BY sch.school_name, term.term_name 
+1

생성하는 원시 SQL을보고 검사하려면 hibernate.show_sql = true로 설정해보십시오. 그게 도움이 될거야. –

답변

0

JPA. 우리는 명시 적으로 할 필요가있다.

감사합니다, :(DTO의 공급 유형의 목록에
스리 하리

+0

사용할 수있는 솔루션인지는 모르겠지만 코드에서 매핑을 수행하고 JPA에 위임하지 않으려는 경우 SqlResultSetMapping을 사용할 수 있습니다. – snowflake

+0

SqlResultSetMapping-을 사용하면 데이터를 엔터티로만 변환 할 수 있습니다. 그러나 사용자 정의 DTO로 변환하려면 JPA 기본 쿼리의 경우 명시 적으로 수행해야합니다. – Srihari

0

가 한 번보세요 대답은 this question입니다. 검증 쿼리가 같은 것이 있는지 확인 SELECT 1 FROM DUAL;

0

을 결과 집합을 변환하지 않습니다 기본 쿼리 JPA 네이티브 쿼리를 사용하면 곧바로 sql이됩니다. new MyDTO(...)은 SQL이 아니므로 sql 파서가 거부합니다. @SqlResultSetMapping을 사용하여 결과 집합에 매핑 된 엔터티를 제공하고 가장 쉽게 수행 할 수 있습니다. 쿼리의 해당 매핑에 사용합니다. IMHO, a를 사용하여 @NamedNativeQuery like

@SqlResultSetMapping(
    name="yourResultSetMapping", 
    entities = { 
     @EntityResult(
      entityClass=YourResultSetEntity.class, 
      fields = { 
       @FieldResult(name = "<entity class field name", column = "result set column name"), 
       . 
       . 
      } 
     ) 
    } 
) 

@NamedNativeQuery(
    name="getSchoolName", 
    query = "<your very long query here", 
    resultSetMapping = "yourResultMapping" 
) 

주의 이름 충돌. 동일한 이름의 결과 집합에 여러 개의 열이있는 경우 JPA는이를 해결할 수 없으며 예외가 발생합니다. 결과 집합의 별칭을 사용하여 각 열에 고유 한 이름을 지정하고 @FieldResult의 열 부분에 별칭 이름을 사용하십시오.

관련 문제