2016-07-22 27 views
1

EclipseLink(Eclipse永続化サービス - 2.1.1.v20100817-r8050)の奇妙な動作は、false(ダミー/ DB内の実際のテーブルではありません) createNativeQuery(query、entity.class)から返された結果セット @Entity パブリッククラスVirtualTableはSerializableを実装しています{ private static final long serialVersionUID = 1L;以下はEclipseLinkがcreateNativeQueryから結果セットを取得する前にランダムにクエリを検索しています

@Id 
@Column(name = "ROW") 
private Integer row; 

@Column(name = "ABC") 
private String abc= null 

@Column(name = "XYZ") 
private String xyz= null 

私は結果セットが返される前に、JPAは、それ自体で検索クエリを発射しようとしているVirtualTable.class

/** 
* Get a list of entity objects by a native query. 
* 
* @param nativeQueryString the query. 
* @param qryParamList the parameters for the query. Must be in the same order as listed in the query. 
* @param entityClass the Class of the entity object. The entityClass field must be mapped to the 
*  column names from the query result set. 
* @return a list of entity object of class entityClass 
*/ 
@SuppressWarnings("rawtypes") 
public static List getObjectListByNativeQuery(String nativeQueryString, 
     List<Object> qryParamList, Class entityClass) { 
    EntityManager em = ReportRepository.getEntityManager(SqlConstants.PERSISTENCE_UNIT_NAME_PODR_RPT ); 

    //populate the parameter list 
    logger.info("em test inside query"+ em.hashCode() +"     "+nativeQueryString + ", with ref class: " + entityClass.getName()); 
    Query query = em.createNativeQuery(nativeQueryString, entityClass); 

    if(qryParamList != null && qryParamList.size() > 0) { 
     for(int i=0; i< qryParamList.size(); i++) { 
      Object param = qryParamList.get(i); 
      //the native query parameters must start with 1 
      query.setParameter(i+1, param); 
     } 
    } 
    List resultList = query.getResultList(); 
      return resultList; 
}enter code here 

にentityClassを設定している結果セット を得るために、私のコードですこのテーブルはDBにはないので、テーブルが見つかりません。 単純なJPA実装であること以外は、persistence.xmlでSOFTキャッシュを使用しています。 JPAがこの特定のエンティティクラスに対してこのクエリを実行するのを避け、それが実際のDBテーブルでないことを定義する方法を教えてください。私は手動でマッピングを避けたい、私は、ただ結果セットを取得します。このため、エンティティを使用すべきではない

[7/21/16 2:46:43:455 EDT] 0007f794 SystemOut  O 2016-07-21 02:46:43.455 [WARN]  org.eclipse.persistence.session.podr02_user=PODRRPT.internalLog:[email protected] Pool : 12 - Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist 

Error Code: 942 
Call: SELECT ROW, ABC, XYZ FROM VIRTUALTABLE WHERE (ROW = ?) 
bind => [79] 
Query: ReadObjectQuery(referenceClass=VirtualTable) 

[7/21/16 2:46:43:455 EDT] 0007f794 SystemOut  O 2016-07-21 02:46:43.455 [ERROR] com.bmo.cm.common.framework.service.AbstReportFileGenerator.generateReportFil e:[email protected] Pool : 12 - Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist 

Error Code: 942 
Call: SELECT ROW, ABC, XYZ FROM VIRTUALTABLE WHERE (ROW = ?) 
bind => [79] 
Query: ReadObjectQuery(referenceClass=VirtualTable) 
+0

スタックトレースを表示すると、クエリが必要な理由と理由が示されます。 – Chris

+0

私は、生産現場では、ログは例外を除外するだけで、私は現地でこのシナリオを再現しようとしましたが、それは起こらなかったので、結局私はプログラムでem.find(virtualentity.class、primarykey) – user1508260

答えて

0

以下のよう

エラーログをexcelsheetへの書き込み、どこでもこのvirtualtableを永続わけではありませんJPAがオブジェクトのアイデンティティとキャッシングを必要とするため、JPAに変更の管理と追跡を要求します。 JPA 2.1を使用している場合は、ConstructorResultを使用してpojoを構築するコンストラクタ式を使用する必要があります。SqlResultSetMapping

+0

あなたのコメントのChrisに感謝します。奇妙なことは、ランダムに起こり、次の5分間隔でジョブが試行され、Findクエリが実行されず、エラーも発生しないということです。 – user1508260

+0

yes - donエンティティを使用しないでください:)。エンティティを使用し続ける場合、その原因を特定することなくエンティティを停止する方法はありません。私の推測では、それはキャッシュに関連するものだろう。エンティティの取得を必要とするものは、このタイプの検索クエリ(無効化を使用する共有キャッシュ設定など)を引き起こす可能性があります。このエンティティの共有キャッシュをオフにすることができます。 – Chris

関連する問題