2017-05-28 46 views
1

我是Hibernate的新手。我已在UserExpense之间建立了映射关系OneToMany。我正在尝试为last week返回User的费用。 这是我正在使用的MySQL查询。Hibernate内部加入OneToMany映射抛出HibernateQueryException

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 

谁能帮我解决这个问题。

回答

1

createQuery(String queryString)为给定HQL查询字符串的 创建Query的新实例。

createSQLQuery(String queryString) 为给定的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

0

你可能想看看: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(); 

(未测试)

或者,您可以k EEP使用标准的SQL syntay如果改用:

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

那么你可能需要阅读Hibernate文档的Chapter 16

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