如何将位置参数传递给createnativequery jpa java

时间:2015-04-24 15:03:55

标签: java hibernate oracle11g jpa-2.1

我的j2ee网络应用程序中有以下SQL查询,我无法按原样运行。命名参数 sourceSystem sourceClientId 似乎没有传递给查询,因此它不会返回任何记录。我在Query对象 querySingleView 中添加了一个监视,当调试器运行代码时,它保持值为null。我还在方法声明下插入了一个 System.out.println 语句,并确认正确的值 sourceSystem sourceClientId 正在传递给方法签名。我正在使用在JBoss EAP 6.21服务器上运行的NetBeans 8.0,JPA 2.1。我有多个实体映射到Oracle数据库中的几个表。

以下是查询(我应该注意查询中的项目遵循 schema.table.column 格式 - 不确定这是否是问题的一部分,但它在一次测试中有效,请参阅下面主要查询下方的评论和示例):

    public List<String> searchSingleView (String sourceSystem, String sourceClientId) {
      //Change the underscore character in the source system value to a dash, and   make it uppercase. This is what single view accepts
     if (!sourceSystem.equals("")) {
        sourceSystemSingleView = sourceSystem.replace('_', '-').toUpperCase();
     }    
     String sqlSingleViewQuery = "SELECT DISTINCT " +
     "MDMCUST_ORS.C_BO_CONTRACT.LAST_ROWID_SYSTEM AS POLICY_SYSTEM, " +
     "MDMCUST_ORS.C_BO_CONTRACT.SRC_POLICY_ID AS POLICY_ID, " +
     "MDMCUST_ORS.C_BO_CONTRACT.ISSUE_DT, " +
     "MDMCUST_ORS.C_BO_PARTY_XREF.SRC_CLIENT_ID AS SRC_CLIENT_ID, " +
     "MDMCUST_ORS.C_BO_PARTY_XREF.PERS_FULL_NAME_TXT, " +
     "MDMCUST_ORS.C_BO_PARTY_XREF.ORG_LEGAL_NAME_TXT, " +
     "MDMCUST_ORS.C_BO_PARTY_XREF.ORG_LEGAL_SFX_TXT, " +
     "MDMCUST_ORS.C_BO_PARTY_XREF.ORG_NAME_TXT, " +
     "MDMCUST_ORS.C_BO_PARTY_XREF.SIN_BIN_TEXT, " +
     "MDMCUST_ORS.C_BO_PARTY_XREF.PERS_BIRTH_DT, " +
     "MDMCUST_ORS.C_LU_CODES.CODE_DESCR_EN AS ADDRESS_PURPOSE_CD, " +
     "MDMCUST_ORS.C_BO_PARTY_POSTAL_ADDR.COMPLETE_ADDRESS_TXT, " +
     "MDMCUST_ORS.C_BO_PARTY_POSTAL_ADDR.CITY_NAME, " +
     "MDMCUST_ORS.C_BO_PARTY_POSTAL_ADDR.COUNTRY_NAME, " +
     "MDMCUST_ORS.C_BO_PARTY_POSTAL_ADDR.POSTAL_CD, " +
     "MDMCUST_ORS.C_BO_PARTY_POSTAL_ADDR.STATE_PROVINCE_NAME " +
     "FROM MDMCUST_ORS.C_BO_PARTY_XREF " +
     "LEFT JOIN MDMCUST_ORS.C_BO_PARTY_POSTAL_ADDR ON                MDMCUST_ORS.C_BO_PARTY_POSTAL_ADDR.PARTY_ROWID = MDMCUST_ORS.C_BO_PARTY_XREF.ROWID_OBJECT " +
     "LEFT JOIN MDMCUST_ORS.C_LU_CODES ON MDMCUST_ORS.C_BO_PARTY_POSTAL_ADDR.POSTAL_ADDR_PURPOSE_CD = MDMCUST_ORS.C_LU_CODES.CODE " +
     "LEFT JOIN MDMCUST_ORS.C_BO_PARTY_REL ON MDMCUST_ORS.C_BO_PARTY_XREF.ROWID_OBJECT = MDMCUST_ORS.C_BO_PARTY_REL.FROM_PARTY_ROWID " +
     "LEFT JOIN MDMCUST_ORS.C_BO_CONTRACT ON MDMCUST_ORS.C_BO_PARTY_REL.CONTRACT_ROWID = MDMCUST_ORS.C_BO_CONTRACT.ROWID_OBJECT " +
     "WHERE MDMCUST_ORS.C_BO_CONTRACT.LAST_ROWID_SYSTEM = :sourceSystemSingleView " +
     "AND MDMCUST_ORS.C_BO_PARTY_XREF.SRC_CLIENT_ID = :sourceClientId " +
     "AND MDMCUST_ORS.C_BO_PARTY_POSTAL_ADDR.POSTAL_ADDR_PURPOSE_CD = '56|07' " +
     "AND MDMCUST_ORS.C_BO_PARTY_POSTAL_ADDR.LAST_ROWID_SYSTEM = MDMCUST_ORS.C_BO_CONTRACT.LAST_ROWID_SYSTEM " +
     "ORDER BY MDMCUST_ORS.C_BO_CONTRACT.LAST_ROWID_SYSTEM";

 querySingleView = emSingleView.createQuery(sqlSingleViewQuery);
 querySingleView.setParameter("sourceSystemSingleView", sourceSystemSingleView);
 querySingleView.setParameter("sourceClientId", sourceClientId);
 querySingleViewResult = (List<String>) querySingleView.getResultList();

 return querySingleViewResult;
 }
}

但是,如果我将文字值放在SQL查询中代替位置参数,它可以正常工作(不使用 setParameter 方法)。

WHERE MDMCUST_ORS.C_BO_CONTRACT.LAST_ROWID_SYSTEM = 'ADMIN' " +
"AND MDMCUST_ORS.C_BO_PARTY_XREF.SRC_CLIENT_ID = '0000001234' " +

我已经在网上看过,但还没有找到任何似乎可以解决这个具体问题的内容。任何帮助将不胜感激。谢谢!

0 个答案:

没有答案