我的Table
有meta-data
files
。 Table
有columns
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
,其中path
是paths
的某个列表之一,lastModified
最大所有行的路径&#39 ;;
我无法在单个HQL Query
中获得结果,所以我分三步完成:
第1步:在第1步中,我尝试获取符合path
是paths
和{lastModified
列表之一的条件的行{1}}是具有“path'。
第2步:在第2步中,我只是从上面的结果集中只收集id以进一步查询。
第3步:我正在尝试sum
size
上与ids
匹配的path
。
详细介绍代码和示例;
第1步:
我想选择paths
是lastModified
的某个给定列表之一的所有行,而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步:
最后,我需要originalSize
列02, 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查询中