【发布时间】:2018-02-03 08:36:21
【问题描述】:
我正在尝试使用 Hibernate HQL 创建一个连接语句。我从未映射为类的联结表中获取数据。基本上我有 User 类和 Chapter 类,还有一个 user_chapters 联结表。我想获取具有给定 ID 的用户的所有章节。代码如下:
使用的DAO方法:
@SuppressWarnings("unchecked")
public List<Chapter> getChaptersOfUser(int id){
List<Chapter> q = new ArrayList<Chapter>();
Transaction tx=null;
try{
Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
tx = session.beginTransaction();
Query query = session.createQuery("FROM Chapter INNER JOIN user_chapters ON chapter.id = user_chapters.chapter_id WHERE user_chapters.user_id = :id");
query.setParameter("id", id);
q = query.list();
tx.commit();
}catch (HibernateException e) {
if (tx != null) {
tx.rollback();
}
LOGGER.error("", e);
}
return q;
}
这是错误日志:
Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException: Unable to resolve path [user_chapters.user_id], unexpected token [user_chapters] [FROM models.Chapter INNER JOIN user_chapters ON chapter.id = user_chapters.chapter_id WHERE user_chapters.user_id = :id]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:131)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:663)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:102)
at dao.ChapterDAO.getChaptersOfUser(ChapterDAO.java:100)
at Main.main(Main.java:25)
Caused by: org.hibernate.QueryException: Unable to resolve path [user_chapters.user_id], unexpected token [user_chapters] [FROM models.Chapter INNER JOIN user_chapters ON chapter.id = user_chapters.chapter_id WHERE user_chapters.user_id = :id]
at org.hibernate.QueryException.generateQueryException(QueryException.java:120)
at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:217)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:141)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:153)
at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:546)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:655)
... 3 more
Caused by: org.hibernate.QueryException: Unable to resolve path [user_chapters.user_id], unexpected token [user_chapters]
at org.hibernate.hql.internal.ast.tree.IdentNode.resolveAsNakedComponentPropertyRefLHS(IdentNode.java:299)
at org.hibernate.hql.internal.ast.tree.IdentNode.resolve(IdentNode.java:143)
at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:114)
at org.hibernate.hql.internal.ast.tree.DotNode.resolveFirstChild(DotNode.java:167)
at org.hibernate.hql.internal.ast.HqlSqlWalker.lookupProperty(HqlSqlWalker.java:694)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:5003)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1286)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4707)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:4175)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2138)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:815)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:609)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:313)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:261)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:266)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:189)
... 9 more
Chapter实体类就是这个:
@Entity
@Table(name = "chapter")
public class Chapter {
@Id
int id;
String title;
int year;
public Chapter(int id,String title,int year){
this.id=id;
this.title=title;
this.year=year;
}
public Chapter(){}
public int getId() {
return id;
}
public String getTitle() {
return title;
}
public int getYear() {
return year;
}
public void setId(int id) {
this.id = id;
}
public void setTitle(String title) {
this.title = title;
}
public void setYear(int year) {
this.year = year;
}
}
hql 查询上的错误点。那么,您认为我应该映射联结类吗?或者您在这里看到任何其他解决方案吗?
【问题讨论】:
-
请显示实体类
-
刚刚编辑过
-
什么是
user_chapters?您创建了一个 HQL 查询,因此您必须使用对象结构,并且章节没有属性user_chapters -
user_chapters 是用户和章节之间的联结表。我想阅读特定用户的每一章。所以 user_chapters 不是属性
-
如果您想使用 HQL,您必须对这种关系进行建模。阅读
@ManyToMany、@ManyToOne、@OneToMany注释
标签: java mysql hibernate join hql