java - Hibernate 内部加入 OneToMany 映射抛出 HibernateQueryException

标签 java mysql hibernate

我是 Hibernate 的新手。我建立了一个OneToMany User 之间的映射和 Expense .我正在尝试退还 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;

当我尝试在 hibernate 状态下使用这个查询时,我得到一个 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

谁能帮我解决一下。

最佳答案

createQuery(String queryString) Create a new instance of Query for the given HQL query string.

createSQLQuery(String queryString) Create a new instance of SQLQuery for the given SQL query string.

您正在使用第一个需要 HQL 作为输入的,要使用 native 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

关于java - Hibernate 内部加入 OneToMany 映射抛出 HibernateQueryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44232881/

相关文章:

java - karaf-maven-插件 : Defining a dependency as a feature

java - 调用 boolean 方法

java - 表单向 Servlet 发送空查询字符串

java - 使用二进制搜索的插入排序无法正常工作

mysql - 如何使用 Laravel 查询生成器从计数中排除数字?

java - 为什么这个 HQL 查询看起来不应该起作用,但它却起作用了?

php - 多个唯一值 MYSQL

php - 是否有任何 CakePHP 函数可以构建并执行查询而不返回结果集

java - 如何协调 J2EE 和 Java EE 数据库访问?

mysql - org.springframework.web.multipart.MultipartException : Current request is not a multipart request