【问题标题】:Passing string parameter JPA native query传递字符串参数 JPA 原生查询
【发布时间】:2019-12-09 19:21:05
【问题描述】:

我有一个本机查询,我想将参数传递给以下查询:

SELECT dqlist.*,score(1) AS rank FROM dq_list_hash_full dqlist WHERE contains(dqlist.dq_english_name,'definescore(fuzzy(, 1, 6, weight),relevance)',1) > 0

我正在使用问号运算符,但不知何故它不理解并给了我 SQL 语法异常:

这是我的尝试:

SELECT dqlist.*,score(1) AS rank FROM dq_list_hash_full dqlist WHERE contains(dqlist.dq_english_name,'definescore(fuzzy('?1', 1, 6, weight),relevance)',1) > 0

我的 JPA 回购方法:

@Query(nativeQuery = true,value="SELECT\r\n" + 
        "     a.EXTERNALID_ENC,\r\n" + 
        "     a.EXTERNALID,\r\n" + 
        "     a.TELNUMBER,\r\n" + 
        "     a.TELAREACODE,\r\n" + 
        "     a.DQ_ENGLISH_NAME,\r\n" + 
        "     a.DQ_ARABIC_NAME,\r\n" + 
        "     a.NAMEFIELD_1,\r\n" + 
        "     a.USAGETYPE,\r\n" + 
        "     a.STATE,\r\n" + 
        "     a.REGION,\r\n" + 
        "     a.LOCALITY,\r\n" + 
        "     a.ADDITIONALLOCALITYINFO,\r\n" + 
        "     a.GEN_TEXT_7,\r\n" + 
        "     a.GEN_SHORTTEXT_1,\r\n" + 
        "     a.GEN_SHORTTEXT_4,\r\n" + 
        "     a.GEN_SHORTTEXT_9,\r\n" + 
        "     a.GEN_SHORTTEXT_10,\r\n" + 
        "     a.CBCM_ENGLISH_NAME,\r\n" + 
        "     a.CBCM_ARABIC_NAME,\r\n" + 
        "     a.CBCM_EMIRATE_NAME,\r\n" + 
        "     a.CBCM_PARTY_ID,\r\n" + 
        "     a.CBCM_ACCOUNT_ID,\r\n" + 
        "     a.RECORD_ID,\r\n" + 
        "     a.DISPLAY_FLAG,\r\n" + 
        "     a.DISPLAY_FLAG_GROUP,\r\n" + 
        "     a.LONGITUDE,\r\n" + 
        "     a.LATITUDE,\r\n" + 
        "     a.NORMALIZED_ENGLISH_NAME,\r\n" + 
        "     a.CBCM_PARTY_ENGLISH_NAME,\r\n" + 
        "     a.CBCM_PARTY_ARABIC_NAME,\r\n" + 
        "     a.MANUAL_UPDATE_FLAG,\r\n" + 
        "     a.RULE_UPDATE_FLAG,\r\n" + 
        "     a.BUSINESS_UPDATE_FLAG,\r\n" + 
        "     a.EXCEL_UPDATE_FLAG\r\n" + 
        "     \r\n" + 
        " FROM\r\n" + 
        "     (\r\n" + 
        "         SELECT\r\n" + 
        "             *\r\n" + 
        "         FROM\r\n" + 
        "             (\r\n" + 
        "                 SELECT\r\n" + 
        "                     dqlist.*,\r\n" + 
        "                     score(1) AS rank\r\n" + 
        "                 FROM\r\n" + 
        "                     dq_list_hash_full dqlist\r\n" + 
        "                 WHERE\r\n" + 
        "                     contains(dqlist.dq_english_name,'definescore(fuzzy(?1, 1, 6, weight),relevance)',1) > 0\r\n" + 
        "                 UNION\r\n" + 
        "                 SELECT\r\n" + 
        "                     dqlist.*,\r\n" + 
        "                     score(1) AS rank\r\n" + 
        "                 FROM\r\n" + 
        "                     dq_list_hash_full dqlist\r\n" + 
        "                 WHERE\r\n" + 
        "                     contains(dqlist.dq_english_name,'!?1' ,1) > 0\r\n" + 
        "             )\r\n" + 
        "         ORDER BY\r\n" + 
        "             rank DESC\r\n" + 
        "     ) a\r\n" + 
        "")
public List<DqListHashFullEntity> findByEngName(@Param("englishName") String englishName);

@Query(value="SELECT\r\n" + 
        "     a.EXTERNALID_ENC,\r\n" + 
        "     a.EXTERNALID,\r\n" + 
        "     a.TELNUMBER,\r\n" + 
        "     a.TELAREACODE,\r\n" + 
        "     a.DQ_ENGLISH_NAME,\r\n" + 
        "     a.DQ_ARABIC_NAME,\r\n" + 
        "     a.NAMEFIELD_1,\r\n" + 
        "     a.USAGETYPE,\r\n" + 
        "     a.STATE,\r\n" + 
        "     a.REGION,\r\n" + 
        "     a.LOCALITY,\r\n" + 
        "     a.ADDITIONALLOCALITYINFO,\r\n" + 
        "     a.GEN_TEXT_7,\r\n" + 
        "     a.GEN_SHORTTEXT_1,\r\n" + 
        "     a.GEN_SHORTTEXT_4,\r\n" + 
        "     a.GEN_SHORTTEXT_9,\r\n" + 
        "     a.GEN_SHORTTEXT_10,\r\n" + 
        "     a.CBCM_ENGLISH_NAME,\r\n" + 
        "     a.CBCM_ARABIC_NAME,\r\n" + 
        "     a.CBCM_EMIRATE_NAME,\r\n" + 
        "     a.CBCM_PARTY_ID,\r\n" + 
        "     a.CBCM_ACCOUNT_ID,\r\n" + 
        "     a.RECORD_ID,\r\n" + 
        "     a.DISPLAY_FLAG,\r\n" + 
        "     a.DISPLAY_FLAG_GROUP,\r\n" + 
        "     a.LONGITUDE,\r\n" + 
        "     a.LATITUDE,\r\n" + 
        "     a.NORMALIZED_ENGLISH_NAME,\r\n" + 
        "     a.CBCM_PARTY_ENGLISH_NAME,\r\n" + 
        "     a.CBCM_PARTY_ARABIC_NAME,\r\n" + 
        "     a.MANUAL_UPDATE_FLAG,\r\n" + 
        "     a.RULE_UPDATE_FLAG,\r\n" + 
        "     a.BUSINESS_UPDATE_FLAG,\r\n" + 
        "     a.EXCEL_UPDATE_FLAG\r\n" + 
        "     \r\n" + 
        " FROM\r\n" + 
        "     (\r\n" + 
        "         SELECT\r\n" + 
        "             *\r\n" + 
        "         FROM\r\n" + 
        "             (\r\n" + 
        "                 SELECT\r\n" + 
        "                     dqlist.*,\r\n" + 
        "                     score(1) AS rank\r\n" + 
        "                 FROM\r\n" + 
        "                     dq_list_hash_full dqlist\r\n" + 
        "                 WHERE\r\n" + 
        "                     contains(dqlist.dq_english_name,'!?1',1) > 0\r\n" + 
        "             )\r\n" + 
        "         ORDER BY\r\n" + 
        "             rank DESC\r\n" + 
        "     ) a\r\n" + 
        "", nativeQuery=true)
public List<DqListHashFullEntity> findByEngNameTwo(@Param("englishName") String englishName);

我知道我在这里遗漏了一些东西。有人可以帮帮我吗?

编辑 1:我添加了带有整个原生查询的 JPA 方法,englishName 参数绑定在两个地方。

日志中生成的SQL:

 SELECT
 a.EXTERNALID_ENC,
 a.EXTERNALID,
 a.TELNUMBER,
 a.TELAREACODE,
 a.DQ_ENGLISH_NAME,
 a.DQ_ARABIC_NAME,
 a.NAMEFIELD_1,
 a.USAGETYPE,
 a.STATE,
 a.REGION,
 a.LOCALITY,
 a.ADDITIONALLOCALITYINFO,
 a.GEN_TEXT_7,
 a.GEN_SHORTTEXT_1,
 a.GEN_SHORTTEXT_4,
 a.GEN_SHORTTEXT_9,
 a.GEN_SHORTTEXT_10,
 a.CBCM_ENGLISH_NAME,
 a.CBCM_ARABIC_NAME,
 a.CBCM_EMIRATE_NAME,
 a.CBCM_PARTY_ID,
 a.CBCM_ACCOUNT_ID,
 a.RECORD_ID,
 a.DISPLAY_FLAG,
 a.DISPLAY_FLAG_GROUP,
 a.LONGITUDE,
 a.LATITUDE,
 a.NORMALIZED_ENGLISH_NAME,
 a.CBCM_PARTY_ENGLISH_NAME,
 a.CBCM_PARTY_ARABIC_NAME,
 a.MANUAL_UPDATE_FLAG,
 a.RULE_UPDATE_FLAG,
 a.BUSINESS_UPDATE_FLAG,
 a.EXCEL_UPDATE_FLAG

 FROM
     (
         SELECT
             *
         FROM
             (
                 SELECT
                     dqlist.*,
                     score(1) AS rank
                 FROM
                     dq_list_hash_full dqlist
                 WHERE
                     contains(dqlist.dq_english_name,'definescore(fuzzy(?1, 1, 6, weight),relevance)',1) > 0
                 UNION
                 SELECT
                     dqlist.*,
                     score(1) AS rank
                 FROM
                     dq_list_hash_full dqlist
                 WHERE
                     contains(dqlist.dq_english_name, '!Bhularam' ,1) > 0
             )
         ORDER BY
             rank DESC
     ) a

【问题讨论】:

  • 您肯定需要删除 '?1' 周围的引号。
  • 它以 ?1 一个作为字符串来搜索而不是参数值。
  • 你能更新你的问题吗?添加在您的 java 代码中定义的查询。
  • 刚刚进行了编辑。请看一看。
  • 启用 SQL 日志记录。将生成的 SQL 查询与异常消息一起添加。

标签: oracle spring-boot jpa spring-data-jpa


【解决方案1】:

它应该通过将 '?1' 替换为 ? 因此,您所要做的就是删除 1 和 '.您可以通过放置多个来处理多个参数?无需编号或转义它们

【讨论】:

    【解决方案2】:

    查询应该是这样的

    SELECT dqlist,score(1) AS rank FROM dq_list_hash_full dqlist WHERE contains(dqlist.dq_english_name,'definescore(fuzzy('?1', 1, 6, weight),relevance)',1) > 0
    

    这里不需要 .* 然后在执行查询之前,您需要将参数设置为

    query.setParameter(1, "ABC").getResultList();
    

    【讨论】:

      【解决方案3】:

      尝试使用 :1

      SELECT dqlist,score(1) AS rank FROM dq_list_hash_full dqlist WHERE 包含(dqlist.dq_english_name,'definescore(模糊(:1, 1, 6, 权重),相关性)',1) > 0

      这应该可行

      【讨论】:

      • 已经尝试过了。这是做什么的,它将 :1 作为字符串而不是参数值,因此导致错误的查询结果。
      【解决方案4】:

      尝试 :1 而不是 ?1。它会起作用的。

      【讨论】:

        【解决方案5】:

        经过一番挣扎,我终于想出了一个解决方案。我用过'||'运算符,因为它用于 Oracle 中的字符串连接。所以我的解决方案是:

        SELECT dqlist,score(1) AS rank FROM dq_list_hash_full dqlist WHERE contains(dqlist.dq_english_name,'definescore(fuzzy('||?1||', 1, 6, weight),relevance)',1) > 0
        

        【讨论】:

          猜你喜欢
          • 2014-01-28
          • 1970-01-01
          • 1970-01-01
          • 2016-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-31
          • 2014-11-02
          相关资源
          最近更新 更多