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

如何将位置参数传递给createnativequery jpa java,java,hibernate,oracle11g,jpa-2.1,Java,Hibernate,Oracle11g,Jpa 2.1,我的j2ee web应用程序中有以下SQL查询,无法正常工作。命名参数sourceSystem和sourceClientId似乎不会传递给查询,因此它不会返回任何记录。我向查询对象querySingleView添加了一个watch,当调试器运行代码时,它保持了null值。我还在方法声明下面插入了System.out.println语句,并确认将正确的值sourceSystem和sourceClientId传递给方法签名。我使用的是运行在JBoss EAP 6.21服务器上的NetBeans 8.

我的j2ee web应用程序中有以下SQL查询,无法正常工作。命名参数sourceSystem和sourceClientId似乎不会传递给查询,因此它不会返回任何记录。我向查询对象querySingleView添加了一个watch,当调试器运行代码时,它保持了null值。我还在方法声明下面插入了System.out.println语句,并确认将正确的值sourceSystem和sourceClientId传递给方法签名。我使用的是运行在JBoss EAP 6.21服务器上的NetBeans 8.0、JPA2.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;
 }
}

我在网上查过,但还没有找到任何能解决这个具体问题的东西。任何帮助都将不胜感激。谢谢大家!

抱歉,在我提交问题后,我意识到我的主题标题和我在问题中给出的细节实际上并不匹配。除了名称参数,我还尝试使用位置参数。如下所示:其中MDMCUST_ORS.C_BO_CONTRACT.LAST_ROWID_SYSTEM=?1+和MDMCUST_ORS.C_BO_PARTY_XREF.SRC_CLIENT_ID=?2,然后在setParameter方法setParameter1、sourceSystemSingleView和setParameter2、sourceClientId中,但这也不能解决我得到的查询:其中cbc.LAST_ROWID_SYSTEM='+sourceSystemSingleView+'+和cbpx.SRC_CLIENT_ID='+sourceClientId++。但我担心这可能是一个SQL注入漏洞。我希望不是因为我真的需要解决这个问题。如果是,我欢迎任何其他建议。再次感谢!
WHERE MDMCUST_ORS.C_BO_CONTRACT.LAST_ROWID_SYSTEM = 'ADMIN' " +
"AND MDMCUST_ORS.C_BO_PARTY_XREF.SRC_CLIENT_ID = '0000001234' " +