【问题标题】:Grails criteria query fails with synatx error when using MYSQL使用 MYSQL 时,Grails 条件查询失败并出现语法错误
【发布时间】:2016-03-14 03:06:13
【问题描述】:

当应用程序连接到 MYSQL 实例时,我有一个查询失败。使用 H2 内存数据库时,查询工作正常。所有其他查询都适用于 MYSQL。

错误消息:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ')' 附近使用正确的语法

控制器动作:

def index() {
def currentUser = currentUser()
def peopleFollowing = currentUser.following
def c = Post.createCriteria()
    def postList = c.list  {
       'in' ("user", peopleFollowing)
       'order' "dateCreated", "desc"
    }
[postList:postList, user : currentUser, peopleFollowing:peopleFollowing]
}

当我删除 in 子句时,查询会针对 MYSQL 运行。因此,似乎是:'in'(“user”,peopleFollowing)导致了这个问题。我认为问题在于 in 是一个 MYSQL 保留字。我试过使用反引号,但不断收到语法错误......?

class Post {


String content
Date dateCreated
User user


static belongsTo = [user : User]

static hasMany = [postComments: PostComment]

static constraints = {
    content (blank: false)
}

static mapping = {
    sort dateCreated:"desc"
    content type:"text"
    postComments sort:"dateCreated",  order:"desc"
}

}

类帖子{ 字符串内容 日期 dateCreated 用户用户 静态的 belongsTo = [用户:用户] 静态 hasMany = [postComments: PostComment] 静态约束 = { 内容(空白:假) } 静态映射 = { 排序 dateCreated:"desc" 内容类型:“文本” postComments sort:"dateCreated", order:"desc" } } 类帖子{ 字符串内容 日期 dateCreated 用户用户 静态的 belongsTo = [用户:用户] 静态 hasMany = [postComments: PostComment] 静态约束 = { 内容(空白:假) } 静态映射 = { 排序 dateCreated:"desc" 内容类型:“文本” postComments sort:"dateCreated", order:"desc" } }

【问题讨论】:

  • 我会查看生成的 SQL 并从那里开始。对于它的价值,in 实际上是一个 groovy 保留字,必须用引号引起来; order 不保留,不需要引号 - order("dateCreated", "desc")
  • 能否请您添加相关域来发帖
  • 您使用的是哪个 MySQL 版本?
  • 我似乎记得我们不得不将我们的“用户”实体重命名为“OurAppNameUser”,因为这个确切的原因......
  • 感谢大家的想法..我能够确定 order 子句本身可以工作。尽管我在我的应用程序的其他条件查询中使用了它,但认为“用户”这个词可能会导致问题的想法绝对是正确的。我正在使用带有 Grails 2.0.3 的 MySQL 5.6.27 也许我只需要一个不同的版本?我要看看生成的 sql.. 我当然希望我不必重命名我的用户类。任何更多的想法都会很棒。我将编辑我的帖子以包含相关域..

标签: grails


【解决方案1】:

我通过这样做解决了这个问题:

def postList = Post.findAllByUserInList( peopleFollowing )

【讨论】:

    【解决方案2】:

    我使用ids 解决了这个问题,并将0 添加到List

    def currentUser = currentUser()
    def peopleFollowingIds = currentUser.following.id
    peopleFollowingIds.add(0)
    def c = Post.createCriteria()
    def postList = c.list  {
        'in' ("user_id", peopleFollowingIds)
        'order' "dateCreated", "desc"
    }
    

    或者类似的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 2022-01-20
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 2022-07-18
      • 2013-09-17
      相关资源
      最近更新 更多