【发布时间】:2022-01-13 19:40:01
【问题描述】:
我正在使用 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))
编辑 2
我用下面的代码解决了这个问题。在这个问题上提供的答案通过在换行符上找到一个缺失的空格来部分解决它。我的问题中的 cmets 帮助我指出了一些连接的正确方向。
@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))"
)
【问题讨论】:
-
这是一个 Psql 错误。所以我们需要查看执行的sql。开启日志,post执行的sql语句。
-
有趣。我们在我基于此的系统中有另一个查询,并且具有相同的连接。我将测试一些建议的更改,我们会看到。当我回到办公桌并更新问题时,我也会得到执行的 SQL。
-
@Christian - 更新了已执行的 sql 和更多信息。
-
好像等级和其他一些字段无法解析。我认为
? in (.)没有意义。您需要一个连接,或者它可能是一个嵌入式?
标签: java postgresql spring-boot