【发布时间】: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