[英]Inner join using native query in hibernate
我有一個表“ questions”,其中包含字段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;
此查詢可從Sequel pro進行。 但是我需要從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
createQuery
用於創建JPA / HQL查詢,請嘗試使用createNativeQuery
。
我經常使用Native SQL Query,如下所示:
@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
請嘗試以下更改。
createNativeQuery(..)
代替createQuery(..)
select v1.* from...
而不是select v1 from...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.