DB2 から ORACLE 11g に移植しようとしていますが、これを行うには、アプリケーションのコードを変更する必要があります (アプリケーション全体を書き直すのを避けます)。"WITH UR" (Uncommitted Read を使用) ステートメントは、ダーティ リードをサポートしていないため、ORACLE では機能しません。ファイルにプロパティが設定された「IF」をコードに入れることを回避する、これを行うためのエレガントで簡単な方法またはパターンはありますか(汚い解決策)?
@Override
public List<Object[]> receiptSummary(String idENTITY) {
List<Object[]> listObj = new ArrayList<Object[]>();
try {
StringBuilder sqlQuery = new StringBuilder();
sqlQuery.append("SELECT TE.DE_TRB AS TYPE_DEBT, COUNT(*) AS NUM_RECEIPTS, SUM(BBR.AMOUNT) AS AMOUNT ")
.append("FROM DRAFTS_TRANSFERS_CREDITING BBR, TRANSFERS_CREDITING BR, LISTS_CREDITING DR, CONDITIONS C, PAYINGS TE ")
.append("WHERE ");
if (idENTITY != null && !idENTITY.isEmpty()) {
sqlQuery.append("BBR.ID_ENTITY = :id_ENTITY AND ");
}
sqlQuery.append("BBR.ID_TRANSFERS_CREDITING=BR.ID ")
.append("AND BR.ID_LISTS_CREDITING = DR.ID ")
.append("AND C.ID_CONDITION = BBR.ID_CONDITION ")
.append("AND DR.STATE='DONE' ")
.append("AND TE.CD_TRB_ENTITY = C.CD_TRB_ENTITY ")
.append("GROUP BY TE.DE_TRB ")
.append("WITH UR"); //FIXME: FOR ORACLE
Query q = em.createNativeQuery(sqlQuery.toString());
if (idENTITY != null && !idENTITY.isEmpty()) {
q.setParameter("id_ENTITY", idENTITY);
}
String msg = "DAO - receiptSummary - id_ENTITY:" + idENTITY;
if (Tracer.isDebugEnabled(this.getClass().getName())) {
Tracer.debug(this.getClass().getName(), "receiptSummary", msg);
Tracer.debug(this.getClass().getName(), "receiptSummary", sqlQuery.toString());
}
System.out.println("receiptSummary - " + msg);
System.out.println("receiptSummary - " + sqlQuery.toString());
listObj = (List<Object[]>) q.getResultList();
} catch (Exception e) {
Tracer.error(this.getClass().getName(), "receiptSummary", e.getMessage());
e.printStackTrace();
}
return listObj;
}