0

以下の私のネイティブクエリは、正常に動作していますoraclesqlplus。しかし、JPAネイティブクエリを介して、次のエラーが発生します。

[エラー]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
4

3 に答える 3

0

この質問への答えを見てください。検証クエリが次のようなものであることを確認しますSELECT 1 FROM DUAL;

于 2010-03-05T16:23:54.667 に答える
0

JPAネイティブクエリは、結果セットを提供されたタイプのDTOのリストに変換しません:(。明示的に行う必要があります。

ありがとう、
シュリハリ

于 2010-03-08T09:26:13.510 に答える
0

JPAネイティブクエリは、まさにそれを意味します。それはストレートSQLです。これnew MyDTO(...)はSQLではないため、SQLパーサーはそれを拒否します。結果セットにマップされるエンティティを提供する必要があります。最も簡単な方法は、@ SqlResultSetMappingを使用し、クエリでそのマッピングを参照することです。IMHO、@NamedNativeQueryのようなものを使用

@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の列部分でエイリアス名を使用します

于 2011-04-01T06:47:20.820 に答える