我正在使用 Java 8、Spring Boot 和 PostgreSQL。
我有以下查詢
@Query(value = "select mc from MasterCourse mc "
"where mc.institution.guid = :institutionGuid or mc.consortium = true "
"and (:searchStr in (mc.tags) "
"or lower(mc.name) like concat('%', lower(:searchStr),'%') "
"or lower(mc.description) like concat('%', lower(:searchStr),'%') "
"or (:searchStr) in (mc.categories) "
"or (:searchStr) in (mc.levels)"
"or mc.authorGuid in (:authorGuids))"
它給了我一個錯誤 PSQLException: ERROR: syntax error at or near "."
我似乎無法弄清楚是什么原因造成的。它似乎不是任何保留字。
任何幫助,將不勝感激。如果您需要更多資訊,請告訴我,我會盡快得到。
編輯:
所以我打開了除錯日志并得到了這個執行的 SQL。好像不喜歡我的and (:searchStr in (mc.tags)。mc.tags 似乎只是回傳一個 (.)。我猜這是因為標簽是一個物件串列,而不僅僅是字串。
我正在嘗試在標簽的“名稱”欄位上匹配 searchStr。關于如何實作這一目標的任何想法?
where mastercour0_1_.institution_id=institutio1_.id and
mastercour0_.id=tags2_.master_course_id and tags2_.tag_id=tag3_.id and mastercour0_.id=categories4_.master_course_id and
categories4_.category_id=category5_.id and
mastercour0_.id=levels6_.master_course_id and
levels6_.level_id=level7_.id and (institutio1_.guid=? or mastercour0_.consortium=true
and (? in (.))
or lower(mastercour0_.name) like ('%'||lower(?)||'%')
or lower(mastercour0_.description) like ('%'||lower(?)||'%')
or ? in (.) or ? in (.) or mastercour0_.author_guid in (null))
EDIT2:我用下面的代碼解決了這個問題。在這個問題上提供的答案通過在換行符上找到一個缺失的空格來部分解決它。對我的問題的評論幫助我指出了一些加入的正確方向。
@Query("select mc from MasterCourse mc "
"left join mc.tags t "
"left join mc.categories cat "
"left join mc.levels l "
"where (mc.institution.guid = :institutionGuid or mc.consortium = true) "
"and (CONCAT('%',lower(:searchStr),'%') like lower(t.friendly) "
"or CONCAT('%',lower(:searchStr),'%') like lower(mc.name) "
"or CONCAT('%',lower(:searchStr),'%') like lower(mc.description) "
"or CONCAT('%',lower(:searchStr),'%') like lower(cat.friendly) "
"or CONCAT('%',lower(:searchStr),'%') like lower(l.friendly) "
"or mc.authorGuid in (:authorGuids))"
)
uj5u.com熱心網友回復:
concat 只接受兩個引數您可以使用||運算子而不是 concat 函式,但這是個人喜好。- 您在倒數第二行的末尾缺少一個空格
(mc.levels)"
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/411524.html
標籤:
