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)
スタックトレースを表示すると、クエリが必要な理由と理由が示されます。 – Chris
私は、生産現場では、ログは例外を除外するだけで、私は現地でこのシナリオを再現しようとしましたが、それは起こらなかったので、結局私はプログラムでem.find(virtualentity.class、primarykey) – user1508260