【问题标题】:Grails Hql query for one to many associationGrails Hql查询一对多关联
【发布时间】:2012-09-06 05:56:17
【问题描述】:

我有一个培训领域类

    class Training {

     String type
     Date createdOn
     Date modifiedOn

    static belongsTo = [course: Course]
    static hasMany = [attachments: Attachment]
  }

我有课程领域类

     class Course {

          String name

          static hasMany = [trainings: Training, tracks: Track]
          static belongsTo = Track
   }

和跟踪域类

    class Track {
        String name 
    }

现在我有一个过滤器(它是 gsp 页面,它将 id 作为参数发送到控件),它根据课程和轨迹选择培训

现在说 params.courseId = 1 和 3

所以我写了查询

   def query = "FROM Training AS t WHERE  t.course.id IN (1,3)"
   trainingList = Training.findAll(query)

这是正确的,我得到了想要的输出。

现在当我说我有轨道 ID 时,params.trackId = 1,2

    def query = "FROM Training AS t WHERE  t.course.tracks.id IN (1,2)"
    trainingList = Training.findAll(query) 

这是行不通的..如何在我有上述关联的地方编写正确的查询。

【问题讨论】:

标签: hibernate grails groovy hql grails-orm


【解决方案1】:

我没有深入了解,但是这个查询给出的结果与您首先编写的查询相同

def trainingList = Training.findAll ("from Training as trnin "+
"join trnin.course.id as trinincr"+
"join trinincr.tracks.id"+
" where trnin.course.id in (1,3)")

【讨论】:

    【解决方案2】:

    不同之处在于您查询的是一对多关联,即“多”方面。

    假设的 HQL:

    def query = "FROM Training AS t WHERE exists " +
      "(from t.course.tracks AS tr where tr.id IN (1,2))"
    

    或标准:

    def trainings = Training.withCriteria {
       course {
         tracks {
           in('id', [1, 2])
         }
      }
    }
    

    【讨论】:

    • 给出错误:类:org.hibernate.hql.ast.QuerySyntaxException 消息:意外令牌:tr 靠近第 1 行,第 75 列 [FROM com.mycompany.opal.Training AS t WHERE 存在(选择轨道tr 来自 t.course.tracks where tr.id IN (1,2))]
    • 已更新。虽然我没有尝试过,但应该可以。不过,我很确定标准。
    • 在没有belongsTo的情况下可以提取列表吗?
    猜你喜欢
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 2013-03-23
    • 2015-03-31
    • 2011-04-18
    • 1970-01-01
    • 2018-01-26
    • 2013-06-08
    相关资源
    最近更新 更多