2012-08-27 172 views
0

此查询不再用于工作。 (我切换到注释,这是两个破剩余试验之一。)带连接表的休眠HQL

我有三个表:

+---------------+ 
| Competition | 
+---------------+ 
| competitionId | 
| . . .   | 
+---------------+ 

+---------------+ 
| Competitor | 
+---------------+ 
| competitorId | 
| . . .   | 
+---------------+ 

+------------------------+ 
| CompetitionCompetitors | 
+------------------------+ 
| competitionId   | 
| competitorId   | 
+------------------------+ 

和代码/查询使用工作是

Query query = session.createQuery(
    "select c.id from Competition c join c.competitors co where co.id = :competitorId"); 
query.setParameter("competitorId", competitor.getCompetitorId()); 
List list = query.list(); 

下面是一些前面的SQL日志记录从休眠到来,再加上错误信息:

Hibernate: update db.competition set competitorId=? where competitionId=? 
Hibernate: update db.competition set competitorId=? where competitionId=? 
Hibernate: update db.competition set competitorId=? where competitionId=? 
17:12:49,232 WARN JDBCExceptionReporter:233 - SQL Error: 1054, SQLState: 42S22 
17:12:49,240 ERROR JDBCExceptionReporter:234 - Unknown column 'competitorId' in 'field list' 

(得承认,我很惊讶地看到发生在一个查询更新)。

这里的注释在竞争:

@OneToMany(targetEntity = Competition.class) 
@JoinColumn(name = "competitorId") 
private Set<Competitor> competitors = new TreeSet<Competitor>(); 

我是怎么了效果也很糟糕?

回答

1

这可能是次要的复制粘贴错误 - 您构建的查询是'查询',但是您执行的查询是'otherQuery'?

但是,我相信的问题是在目标实体价值。从规格:

作为关联的目标的实体类。仅当使用Java泛型定义集合值关系属性时才可选。必须另外指定。

在您的情况下,您必须指定Competitor.class或将其忽略。您必须指定JoinTable注释以及joinColumninverseJoinColumn值作为将要搜索的默认JoinTableCompetitor_Competition

@OneToMany 
@JoinTable(name = "CompetitionCompetitors", inverseJoinColumns={@JoinColumn(name="competitorId")}, joinColumns={@JoinColumn(name="competitionid")} 
private Set<Competitor> competitors = new TreeSet<Competitor>(); 

我不知道为什么这些更新语句正在执行,如果你所做的只是查看这些值。

+0

非常了解映射和JPA。谢谢!这使查询工作。 – Marvo