Grails在表上查询LEFT JOIN,没有域关系

时间:2013-10-18 09:59:01

标签: sql grails join hql

我是Grails的新手,我几个小时都遇到了这个问题。在此先感谢您的帮助!

这是我的问题:

我有一个包含两个表的数据库

  1. PROJECT
  2. LIKES
  3. 您可以猜测用户有权喜欢 项目。 在域类项目中有 NO 关系( belongsTO,hasOne等等。) 在域类喜欢

    中相同

    在数据库中,表格 LIKES 有一个 project_id 字段,但设置为foreign_key。这是出于正确目的而采用这种方式。

    现在我需要使用grails执行本机SQL查询,这非常简单,并返回预期的结果。

    结果是所有喜欢或不喜欢的项目

    以下是查询:

    SELECT project.name, Likes.likes
    FROM project
    LEFT JOIN Likes
    ON project.id = likes.project_id;
    

    我无法找到将此SQL查询转换为HQL的方法。 似乎HQL在Domain实例上工作,并且域之间没有关系这一事实会返回错误,例如“Domain Project has Likes属性”,这是正确的。

    有没有办法通过一个查询获得正确的结果,还是我需要进行两次查询并以编程方式构建一个包含结果的数组?

    谢谢你的帮助

2 个答案:

答案 0 :(得分:3)

如果您的域类没有关系,则无法使用HQL执行此操作,正如您所注意到的那样。

但是在Grails中,您可以使用groovy.sql.Sql直接访问数据库。服务示例:

class MyService {
  def dataSource

  void addNewRecord(String data) {
    groovy.sql.Sql sql = new Sql(dataSource)
    sql.execute("insert into my_table(my_anydata_clomn) values(sys.anyData.convertVarchar2(?))",[data])
  }

}

答案 1 :(得分:1)

好的,它的工作原理如下:)

 def dataSource

    def getProjectList() {
        groovy.sql.Sql sql = new groovy.sql.Sql(dataSource)
        log.info(sql)
        log.info("datasource " + dataSource)
        def t = sql.rows("SELECT * \n" +
                "FROM project\n" +
                "LEFT JOIN Likes\n" +
                "ON project.id=likes.project_id\n" +
                "ORDER BY likes.likes")
        sql.close()
        return t;
    }