java.lang.IllegalArgumentException: org.hibernate.QueryException 休眠加入
java.lang.IllegalArgumentException: org.hibernate.QueryException hibernate join
我正在尝试使用 Hibernate HQL 创建连接语句。我从未映射为 Class 的结点 table 获取数据。基本上我有 class 用户和 class 章节,有一个 user_chapters 连接点 table。我想获取具有给定 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
章节实体class是这个:
@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查询的错误点。那么,你认为我应该映射路口 class 吗?或者你在这里看到任何其他解决方案吗?
类似这样的内容(在本章的用户实体中也是如此):
@Entity
public class Chapter {
private Set<User> users;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
@JoinTable(name = "user_chapters", joinColumns = {
@JoinColumn(name = "user_id", nullable = false, updatable = true) },
inverseJoinColumns = { @JoinColumn(name = "chapter_id", nullable = false, updatable = true)
})
public Set<User> getUsers() {
return users;
}
}
实际上我不确定 HQL。我在自己的项目中找到了一个旧示例,我在其中使用了 SQL 而不是:
String sql = "select ch from Chapter ch join ch.users us where us.id = :id
也许会奏效:)
我正在尝试使用 Hibernate HQL 创建连接语句。我从未映射为 Class 的结点 table 获取数据。基本上我有 class 用户和 class 章节,有一个 user_chapters 连接点 table。我想获取具有给定 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
章节实体class是这个:
@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查询的错误点。那么,你认为我应该映射路口 class 吗?或者你在这里看到任何其他解决方案吗?
类似这样的内容(在本章的用户实体中也是如此):
@Entity
public class Chapter {
private Set<User> users;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
@JoinTable(name = "user_chapters", joinColumns = {
@JoinColumn(name = "user_id", nullable = false, updatable = true) },
inverseJoinColumns = { @JoinColumn(name = "chapter_id", nullable = false, updatable = true)
})
public Set<User> getUsers() {
return users;
}
}
实际上我不确定 HQL。我在自己的项目中找到了一个旧示例,我在其中使用了 SQL 而不是:
String sql = "select ch from Chapter ch join ch.users us where us.id = :id
也许会奏效:)