org.hibernate.hql HQL子查询中的错误

时间:2014-10-28 08:10:22

标签: java sql hibernate jpa hql

我的Tablemeta-data filesTablecolumns id, path, originalSize, lastModified and info_id;

id, path,  lastModified,  originalSize, infoid
01, A.txt,   25/10/2014,  25,                 0
02, A.txt,   26/10/2014,  30,                 0
03, B.txt,   25/10/2014,  40,                 0
04, B.txt,   27/10/2014,  50,                 0
05, C.txt,   25/10/2014,  10,                 0
06, C.txt,   26/10/2014,  20,                 0
07, D.txt,   25/10/2014,  5,                  0
08, D.txt,   27/10/2014,  10,                 0

我需要在sum列上originalSize,其中pathpaths的某个列表之一,lastModified最大所有行的路径&#39 ;;

我无法在单个HQL Query中获得结果,所以我分三步完成:

第1步:在第1步中,我尝试获取符合pathpaths和{lastModified列表之一的条件的行{1}}是具有“path'。

的所有行的最大值

第2步:在第2步中,我只是从上面的结果集中只收集id以进一步查询。

第3步:我正在尝试sum size上与ids匹配的path

详细介绍代码和示例;

第1步:

我想选择pathslastModified的某个给定列表之一的所有行,而id, filename, lastmodified 02, A.txt, 26/10/2014 04, B.txt, 27/10/2014 06, C.txt, 26/10/2014 08, D.txt, 27/10/2014 是所有行的最大值{`1};

HQL

我使用public List<ObjectMetadata> getListOfLatestModifiedFiles(String infoId) { List<ObjectMetadata> objectMetadataList =null; try { String sQuery = "SELECT om.id, om.path, om.originalSize, MAX(om.lastModified) "+ "FROM "+ "ObjectMetadata om "+ "WHERE om.infoId = '"+infoId+"' "+ "GROUP BY om.id, om.path, om.originalSize"; org.hibernate.Query query = getEm().getSession().createQuery(sQuery); objectMetadataList = query.list(); } catch (Exception nre) { System.out.println(nre.toString()); } return objectMetadataList; } 编写了以下方法,返回上述结果;

IDs

第2步:

现在,我只需above result;

中的 id 02 04 06 08
List<ObjectMetadata>

为了只获取ID,我编写了另一种遍历id并仅返回public List<String> getIds(List<ObjectMetadata> objectMetadataList) { List<String> ids = new ArrayList<String>(); try{ Iterator itr = objectMetadataList.iterator(); while(itr.hasNext()) { Object[] obj = (Object[]) itr.next(); String id = String.valueOf(obj[0]); ids.add(id); } } catch (Exception nre) { System.out.println(nre.toString()); } return ids; } 的方法;

sum

第3步:

最后,我需要originalSize02, 30 04, 50 06, 20 08, 10 与这些ID匹配;

id,originalSize

SUM

110 = public long getSizeOfAllLatestModifiedFiles(List<String> list) { Long size = 0l; String sQuery = "SELECT SUM(om.originalSize) "+ "FROM "+ "ObjectMetadata om "+ "WHERE om.id IN (:ids) "; org.hibernate.Query query = (Query) getEm().getSession().createQuery(sQuery); query.setParameterList("ids", list); size = (Long) query.uniqueResult(); return size; }

为此,我写了另一种方法:

    String sSubQuery =  "SELECT om.path, om.originalSize, MAX(om.lastModified) "+
            "FROM "+
            "ObjectMetadata om "+
            "WHERE om.infoId = '"+infoId+"' "+
            "GROUP BY om.path, om.originalSize";

     String sQuery =  "SELECT SUM(o.originalSize) "+
            "FROM "+
            "("+
            " "+sSubQuery+
            " ) "+
            "o";

现在我的问题是:我不能完成所有这3个步骤,只能在单个查询中运行

我尝试了以下单个查询;

 Query q = getEm().createQuery(sQuery);

但是在下面的代码行中;

ERROR [2014-10-27 11:17:24,264] org.hibernate.hql.internal.ast.ErrorCounter: line 1:33: unexpected token: (
ERROR [2014-10-27 11:17:24,304] org.hibernate.hql.internal.ast.ErrorCounter: line 1:33: unexpected token: (
! antlr.NoViableAltException: unexpected token: (

ERROR [2014-10-27 11:17:24,306] org.hibernate.hql.internal.ast.ErrorCounter: line 1:68: unexpected token: MAX
ERROR [2014-10-27 11:17:24,312] org.hibernate.hql.internal.ast.ErrorCounter: line 1:68: unexpected token: MAX
! antlr.NoViableAltException: unexpected token: MAX 

我收到以下错误。

{{1}}

请帮我将以上3个步骤运行到单个HQL查询中

0 个答案:

没有答案