【问题标题】:Grails: Criteria query fail on join tables?Grails:连接表上的条件查询失败?
【发布时间】:2014-05-28 13:47:46
【问题描述】:

我们在使用 Grails (2.3.7) 时遇到问题,它与标准查询和映射有关。问题是在定义条件并尝试列出结果后,Hibernate 似乎没有将映射表添加到查询中,因此查询失败。

现在我们有 3 个相关的表:Users、Competitions + UserCompetition,它们与其他 2 个表之间的关系具有复合主键,每个表都作为外键引用。

这里是我们域的定义:

class User {
(...)
static hasMany = [competitions:Competition]

static mapping = {
    table "users"
(...)
    competitions joinTable: [name: 'usersCompetitions',
        key: 'userId',
        column: 'competitionId']
}


class Competition {
(...)
static hasMany = [users:User]

static belongsTo = User

static mapping = {
    table "competitions"
    id column: 'competitionId'
    users joinTable: [name: 'usersCompetitions',
        key: 'competitionId',
        column: 'userId']
}
}


class UserCompetition implements Serializable {

private static final long serialVersionUID = 1

Competition competition
User user
boolean planning

static mapping = {
    table "usersCompetitions"
    id composite: ['user', 'competition']
    competition column: 'competitionId'
    user column: 'userId'
}


boolean equals(other) {
    if (!(other instanceof UserCompetition)) {
        return false
    }

    other.user?.id == user?.id &&
            other.competition?.id == competition?.id
}

int hashCode() {
    def builder = new HashCodeBuilder()
    if (user) builder.append(user.id)
    if (competition) builder.append(competition.id)
    builder.toHashCode()
}

static UserCompetition get(long userId, long competitionId) {
    UserCompetition.where {
        user == User.load(userId) &&
                competition == Competition.load(competitionId)
    }.get()
}

}

最后,我们正在尝试使用 Criteria 从 UserCompetitions 中检索一些数据:

def c = UserCompetition.createCriteria()
def competitions = c.list{
        createAlias("competition", "comp")
        and{
            isNotNull("comp.startDate")
            gt("comp.startDate", now)
        }
        eq("user.id",user.id)
        ne("planning",true)
        maxResults(3)
        order("comp.startDate", "asc")
    }

这就是我们得到的:

Message: Unknown column 'comp1_.startDate' in 'where clause'

这是 Hibernate 生成的查询,如您所见,它没有添加与 Competition 表的关系:

select this_.userId as userId0_0_, this_.competitionId as competit2_0_0_, this_.planning as planning0_0_ from usersCompetitions this_ where (comp1_.startDate is not null and comp1_.startDate>?) and this_.userId=? and this_.planning<>? order by comp1_.startDate asc limit ?

我们试图了解发生了什么,但我们无法理解为什么 Hibernate 没有将映射表添加到查询中:-?

提前致谢,

【问题讨论】:

    标签: hibernate grails join criteria


    【解决方案1】:

    问题与 Grails 如何解释所有使用 joinTable 的映射有关。

    我们删除了UserCompetition 域类中的所有joinTables 引用,并通过UserCompetition 链接它们而不是彼此链接,查询开始工作。

    class User {
    (...)
    static hasMany = [competitions:UserCompetition]
    
    static mapping = {
        table "users"
    (...)
        /* competitions joinTable: [name: 'usersCompetitions',
            key: 'userId',
            column: 'competitionId'] */
    }
    
    
    class Competition {
    (...)
    static hasMany = [users:UserCompetition]
    
    static belongsTo = User
    
    static mapping = {
        table "competitions"
        id column: 'competitionId'
        /* users joinTable: [name: 'usersCompetitions',
            key: 'competitionId',
            column: 'userId'] */
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多