【问题标题】:INNER JOIN HQL Query from Grails来自 Grails 的 INNER JOIN HQL 查询
【发布时间】:2011-10-25 17:02:49
【问题描述】:

我正在尝试弄清楚如何使这段代码工作:

def searchString = unchecked.join(",");
        searchString = searchString.replace("\"", "'")
        println("searchString: " + searchString);

        def matches=Employee.executeQuery("select e.id from Employee as e INNER JOIN Education as ed ON e.id = ed.employee_id INNER JOIN education_type AS et ON et.id = ed.type_id WHERE et.name  in (" +searchString + ")");

这是传递给 executeQuery 的查询字符串

select e.id from Employee as e INNER JOIN Education as ed ON e.id = ed.employee_id INNER JOIN education_type AS et ON et.id = ed.type_id WHERE et.name  in ('AA','BS')

我可以在 SQL Server 中运行它并返回正确的结果,但是我的 grails 代码抱怨:

Stacktrace follows:
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: ON near line 1, column 59 [select e.id from Employee as e INNER JOIN Education as ed ON e.id = ed.employee_id INNER JOIN education_type AS et ON et.id = ed.type_id WHERE et.name  in ('AA','BS')]

那么我做错了什么?执行查询的域对象是否错误?

【问题讨论】:

    标签: sql grails hql


    【解决方案1】:

    考虑这样做:

    def employee = Employee.withCriteria {
        education {
            educationType {
                in("name", ["AA", "BS"])
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      HQL 与标准 SQL 略有/足够不同。假设 Hibernate 知道这些对象之间的关系,您可以将查询简化为

      List<String> typeNames = unchecked.collect { it.replace("\"", "") }
      String query = """FROM Employee e
                        WHERE e.education.educationType.name IN (:typeNames)"""
      List<Employee> = Employee.executeQuery(query, [typeNames: typeNames])
      

      在查询中使用命名参数或位置参数以防止 sql 注入非常重要。此外,如果您真的只想要员工 ID 列表而不是实例,您可以将 SELECT e.id 放回那里。也没有理由包含引号,因为当绑定参数时,它们将为您正在使用的数据库使用正确的引号,因为上面的代码 sn-p 也删除了引号,但您可能会重新考虑甚至让它们成为放在首位。

      【讨论】:

      • 这在查询中的 : 上给了我一个意外的标记。我认为您不能在发送到 HQL 查询的参数类型中使用列表
      • 抱歉,请尝试在命名参数周围加上括号,例如(:typeNames)
      • 谢谢。我也在谷歌搜索后发现了这一点。我想我将不得不对此进行一些修补。我遇到了一个问题,即educationType 是 Education 下的一个集合
      猜你喜欢
      • 2013-08-25
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 2016-07-04
      • 1970-01-01
      • 2018-06-12
      相关资源
      最近更新 更多