2016-03-26 42 views
0

我有一個表「問題」,其中包含字段id,版本以及其他字段。一個問題可以有多個具有相同ID和不同版本的記錄。我需要爲最高版本的每個問題選擇問題記錄。在休眠中使用本機查詢的內部聯接

我的SQL查詢

select * from questions v1 inner join 
    (select id, max(version) as highest_version from 
     questions group by id 
    )as v2 on v1.id = v2.id and v1.version = v2.highest_version; 

該查詢將從續集專業工作。但我需要從Java運行這個,我正在使用休眠。

我的Java代碼是:

String assertQuestionQuery = "select v1 from Question v1 inner join " 
     + "(select t.id, max(t.version) as highest_version " 
     + "from Question t " 
     + "group by t.id) " 
     + "as v2 on v1.id = v2.id and v1.version = v2.highest_version"; 

Query q = sourceEm.createQuery(assertQuestionQuery, Question.class); 
List<Question> questionVersions = q.getResultList(); 

我收到以下錯誤:

ERROR org.hibernate.hql.internal.ast.ErrorCounter line 1:87: unexpected token: ( 

如果我刪除我收到以下錯誤括號:

ERROR org.hibernate.hql.internal.ast.ErrorCounter line 1:87: unexpected token: select 
+0

@srinivas。 'createNativeQuery'而不是'createQuery'並更新查詢,使用'select v1。* from'而不是'select v1 from' –

+0

@MadhusudanaReddySunnapu謝謝!!那工作。 – srinivas

+0

很高興幫助。 –

回答

0

嘗試用以下更改。

  • 使用createNativeQuery(..)代替createQuery(..)
  • 更新你能用以下更改嘗試查詢中使用select v1.* from...代替select v1 from...
1

createQuery用於創建JPA/HQL查詢,請嘗試使用createNativeQuery

0

我經常使用原生SQL查詢如下:

@Override 
public List<MyObj> findListNew() { 
    Session session = null; 
    Transaction tx = null; 
    List<MyObj> objects = null; 

    try { 
     session = HibernateUtil.getSessionFactory().openSession(); 
     tx = session.beginTransaction();  

     // Write Native SQL here 
     StringBuffer SqlCommand =new StringBuffer(); 
     SqlCommand.append("select * \n");    
     SqlCommand.append(" from tableA a , tableB b \n");   
     SqlCommand.append(" where a.tb_id = b.id; "); 

     // Map SQL results to your class MyObj 
     SQLQuery query = (SQLQuery) session.createSQLQuery(SqlCommand.toString()) 
       .addScalar("AttributeOfMyObj",IntegerType.INSTANCE) 
       .setResultTransformer(Transformers.aliasToBean(MyObj.class)); 

     objects = query.list(); 
     tx.commit();    

    } catch (HibernateException e) { 
    } catch (Exception e) { 
    } finally { 
     if (session != null) 
      session.close(); 
    } 

    return objects; 

} 

您可以&例子在Hibernate的官方網站找到更多的指令:https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html