PSQLException: 错误: 语法错误 在 "." 或接近



我使用的是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;name";标签的字段。关于如何实现这一点,有什么想法吗?

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))

编辑2

我用以下代码解决了这个问题。这个问题的答案通过在换行处找到一个缺失的空格部分解决了这个问题。对我的问题的评论帮助我为一些加入指明了正确的方向。

@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))"
)
  1. concat只接受两个参数您可以使用||运算符而不是concat函数,但这是个人偏好
  2. 您在倒数第二行(mc.levels)"+的末尾缺少一个空格

相关内容

最新更新