2017-05-28 18 views
1

Hibernateを初めて使用しています。私はUserExpenseの間にOneToManyのマッピングを確立しました。 last weekUserの費用を返そうとしています。 これは私が使用しているMySQLのクエリです。私は休止状態では、このクエリを使用しようとすると、私はHibernate Inner Join OneToManyマッピングがHibernateQueryExceptionをスローする

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 

IS-取得エラーは、誰もが私はそれを修正する助けてください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(); 

を取得

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;

答えて

1

createQuery(String queryString) のHQLクエリ文字列のクエリの新しいインスタンスを作成します。

createSQLQuery(文字列クエリ文字列) 指定したSQLクエリ文字列の新しいSQLQueryインスタンスを作成します。

入力としてHQLを使用する最初のものを使用しています。ネイティブSQLを使用するには、2番目のものを使用する必要があります。

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

あなたはを見てみたいことがあります

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(); 
:次のようになります彼らのオブジェクト指向スタイルにあなたが持っているHQLを使用している場合 I can't make a inner join between two tables in hibernate hql query

(未テスト)

また、k

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

その後、あなたはHibernateのドキュメントのChapter 16を参照することもできます。あなたの代わりに使用する場合、EEP標準のSQL syntayを使用。

SQLダイアレクトは、基になるデータベースによって異なります。アプリケーションによっては、SQL文を壊す可能性のある別のデータベースが異なるシステムで使用されている可能性があります。