【问题标题】:java.lang.IllegalArgumentException: org.hibernate.QueryException hibernate joinjava.lang.IllegalArgumentException: org.hibernate.QueryException 休眠加入
【发布时间】: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


【解决方案1】:

类似这样的东西(在章节的用户实体中也是如此):

@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

也许这会起作用:)

【讨论】:

    猜你喜欢
    • 2019-04-18
    • 1970-01-01
    • 2016-03-15
    • 2014-01-27
    • 2013-05-22
    • 2018-07-16
    • 1970-01-01
    相关资源
    最近更新 更多