【发布时间】: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