【问题标题】:Hibernate Inner Join OneToMany Mapping throws HibernateQueryExceptionHibernate Inner Join OneToMany 映射抛出 HibernateQueryException
【发布时间】:2017-05-28 23:13:00
【问题描述】:

我是 Hibernate 的新手。我已经在User 和Expense 之间建立了OneToMany 映射。我正在尝试为User 退回last week 的费用。 这是我正在使用的 MySQL 查询。

select SUM(amount) from Expense INNER JOIN User ON Expense.user_id = User.id AND User.username ='testUser' WHERE created >= curdate() - INTERVAL DAYOFWEEK(curdate())+1 DAY AND created < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY;

当我尝试在休眠中使用这个查询时,我得到一个HibernateQueryException

 String query = "select SUM(amount) from Expense INNER JOIN User ON Expense.user_id = User.id AND user.username ='sarvam' WHERE created >= curdate() - INTERVAL DAYOFWEEK(curdate())+1 DAY AND created < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY";
 List list = session.createQuery(query).list();

我得到的错误是-

Exception in thread "main" org.hibernate.QueryException: outer or full join must be followed by path expression [select SUM(amount) from com.challenge.pojo.Expense INNER JOIN User ON Expense.user_id = User.id AND user.username ='sarvam' WHERE created >= curdate() - INTERVAL DAYOFWEEK(curdate())+1 DAY AND created < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY]
    at org.hibernate.QueryException.generateQueryException(QueryException.java:120)
    at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
    at org.hibernate.hql.internal.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:233)
    at org.hibernate.hql.internal.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:193)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:115)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:76)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:150)
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:298)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:236)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1825)
    at com.challenge.dao.ExpenseDAO.getExpensesForLastWeek(ExpenseDAO.java:52)
    at com.challenge.dao.ExpenseDAO.getExpensesForLastWeek(ExpenseDAO.java:44)
    at com.challenge.dao.Test.main(Test.java:27)
Caused by: org.hibernate.QueryException: outer or full join must be followed by path expression
    at org.hibernate.hql.internal.classic.FromParser.token(FromParser.java:253)
    at org.hibernate.hql.internal.classic.ClauseParser.token(ClauseParser.java:93)
    at org.hibernate.hql.internal.classic.PreprocessingParser.token(PreprocessingParser.java:118)
    at org.hibernate.hql.internal.classic.ParserHelper.parse(ParserHelper.java:43)
    at org.hibernate.hql.internal.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:223)
    ... 10 more

谁能帮我解决它。

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:

    createQuery(String queryString) 为 给定 HQL 查询字符串。

    createSQLQuery(字符串查询字符串) 为给定的 SQL 查询字符串创建一个新的 SQLQuery 实例。

    您使用的是第一个期望 HQL 作为输入的,对于使用本机 SQL,您应该使用第二个。

    String query = "select SUM(amount) from Expense INNER JOIN User ON Expense.user_id = User.id AND user.username ='sarvam' WHERE created >= curdate() - INTERVAL DAYOFWEEK(curdate())+1 DAY AND created < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY";
    List list = session.createSQLQuery(query).list();
    

    Session Documentation

    【讨论】:

      【解决方案2】:

      你可能想看看:I can't make a inner join between two tables in hibernate hql query

      如果使用 HQL,您必须使用其面向对象的样式,这可能看起来像这样:

      String query = "select SUM(amount) from Expense exp INNER JOIN User u ON e.user_id = u.id AND u.username = 'sarvam' ...";
      List list = session.createQuery(query).list();
      

      (未经测试)

      如果您改用以下方式,您可以继续使用标准 SQL 语法:

      List list = session.createSQLQuery(query).list();
      

      那么您可能想阅读 Hibernate 文档的 Chapter 16。

      请记住,SQL 方言取决于底层数据库。根据您的应用程序,可能会在不同的系统上使用不同的数据库,这可能会破坏您的 SQL 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-08
        • 2012-02-08
        • 2019-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多