【问题标题】:PSQLException: ERROR: syntax error at or near "."PSQLException:错误:“。”处或附近的语法错误
【发布时间】: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


【解决方案1】:
  1. concat 只接受两个参数 您可以使用 || 运算符代替 concat 函数,但这是个人喜好。
  2. 您在倒数第二行末尾缺少一个空格(mc.levels)"+

【讨论】:

  • 呃,谢谢#2,我已经看了很长时间了,我没有注意到...当我回到我的办公桌时我会测试。我也会测试#1。
  • concat() 可以接受 任何 个参数:dbfiddle.uk/…
  • 是的,@a_horse_with_no_name 是对的,我懒得去查看实际的 postgres 文档,但我猜你至少可以在修复这个 bug 后取得一些进展。我只是习惯于在这样的连接查询上添加额外的空间,即使它们不是必需的,也可以为您节省大量愚蠢的调试时间。
  • CONCAT() 和 || NULL 值的行为非常不同:SELECT 'foo' || NULL, CONCAT('foo', NULL);
猜你喜欢
  • 2020-01-03
  • 1970-01-01
  • 2017-03-16
  • 2017-02-20
  • 2017-07-15
  • 2010-12-24
  • 2016-07-10
  • 2018-11-21
  • 1970-01-01
相关资源
最近更新 更多