List of usage examples for org.hibernate.criterion ProjectionList add
public ProjectionList add(Projection projection)
From source file:ke.co.mspace.nonsmppmanager.service.SMSOutServiceImpl.java
@Override public Map<String, Object> smsOutGroupBy(String user, String startDate, String endDate) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.getTransaction().begin();// ww w . ja v a 2 s . c om Criteria criteria = session.createCriteria(SMSOut.class); /* * This is where the report is going to come from * projectionList.add(Projections.sqlGroupProjection("YEAR(time_submitted) as yearSubmitted, MONTHNAME(STR_TO_DATE(MONTH(time_submitted), '%m')) as monthSubmitted, time_submitted as timeSubmitted", "timeSubmitted", new String[] { "monthSubmitted", "timeSubmitted", "yearSubmitted" }, new Type[] { StandardBasicTypes.STRING })); */ ProjectionList projectionList = Projections.projectionList(); projectionList.add(Projections.sqlGroupProjection( "YEAR(time_submitted) as yearSubmitted, MONTHNAME(STR_TO_DATE(MONTH(time_submitted), '%m')) as timeSubmitted", "yearSubmitted, timeSubmitted", new String[] { "yearSubmitted", "timeSubmitted" }, new Type[] { StandardBasicTypes.LONG, StandardBasicTypes.STRING })); projectionList.add(Projections.rowCount()); criteria.setProjection(projectionList); //This is added criteria.add(Restrictions.eq("user", user)); criteria.addOrder(Order.asc("timeSubmitted")); criteria.add(Restrictions.between("timeSubmitted", startDate, endDate)); List<Object[]> results = criteria.list(); for (Object[] aResult : results) { System.out.println("the Object: " + Arrays.deepToString(aResult)); System.out.println("Year : " + aResult[0] + " Month : " + aResult[1] + " No. Sent : " + aResult[2]); } Map<String, Object> mapResult = new HashMap<>(); mapResult.put("result", results); mapResult.put("noSMS", 20); session.getTransaction().commit(); return mapResult; }
From source file:ke.co.mspace.nonsmppmanager.service.SMSOutServiceImpl.java
@Override public Map<String, String> smsOutGroupByUser(String startDate, String endDate) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.getTransaction().begin();/*from w w w .java2s.c om*/ Criteria criteria = session.createCriteria(SMSOut.class); Calendar startAnotherDate = null; Calendar endAnotherDate = null; try { startAnotherDate = stringToCalendar(startDate); endAnotherDate = stringToCalendar(endDate); } catch (ParseException ex) { Logger.getLogger(SMSOutServiceImpl.class.getName()).log(Level.SEVERE, null, ex); } /* * This is where the report is going to come from * projectionList.add(Projections.sqlGroupProjection("YEAR(time_submitted) as yearSubmitted, MONTHNAME(STR_TO_DATE(MONTH(time_submitted), '%m')) as monthSubmitted, time_submitted as timeSubmitted", "timeSubmitted", new String[] { "monthSubmitted", "timeSubmitted", "yearSubmitted" }, new Type[] { StandardBasicTypes.STRING })); */ ProjectionList projectionList = Projections.projectionList(); projectionList.add(Projections.sqlGroupProjection( "YEAR(time_submitted) as yearSubmitted, MONTHNAME(STR_TO_DATE(MONTH(time_submitted), '%m')) as timeSubmitted, user as userName", "yearSubmitted, timeSubmitted, userName", new String[] { "yearSubmitted", "timeSubmitted", "userName" }, new Type[] { StandardBasicTypes.LONG, StandardBasicTypes.STRING, StandardBasicTypes.STRING })); projectionList.add(Projections.rowCount()); criteria.setProjection(projectionList); criteria.addOrder(Order.asc("timeSubmitted")); criteria.add(Restrictions.between("timeSubmitted", startDate, endDate)); List<Object[]> results = criteria.list(); Map<String, Integer> json = new LinkedHashMap<>(); Set<String> months = new LinkedHashSet<>(); Set<String> users = new LinkedHashSet<>(); while (startAnotherDate.before(endAnotherDate)) { String month = startAnotherDate.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault()); int year = startAnotherDate.get(Calendar.YEAR); for (Object[] aResult : results) { json.put(year + "-" + month + "-" + aResult[2], 0); months.add(aResult[0] + "-" + aResult[1]); users.add(String.valueOf(aResult[2])); } startAnotherDate.add(Calendar.MONTH, 1); } String madeUp = null; for (String aString : json.keySet()) { for (Object[] aResult : results) { madeUp = aResult[0] + "-" + aResult[1] + "-" + aResult[2]; if (aString.equals(madeUp)) { json.put(aString, Integer.parseInt(String.valueOf(aResult[3]))); } } } StringBuilder builder = new StringBuilder(); for (String aMonth : months) { builder.append("["); builder.append('"'); builder.append(aMonth.substring(0, 8)); builder.append('"'); builder.append(','); for (String aString : json.keySet()) { if (aString.contains(aMonth)) { builder.append(json.get(aString)); builder.append(","); } } builder.append("]"); if (builder.length() > 0) { if (builder.charAt(builder.lastIndexOf("]") - 1) == ',') { builder.deleteCharAt(builder.lastIndexOf("]") - 1); } } builder.append(","); } if (builder.length() > 0) { builder.deleteCharAt(builder.lastIndexOf(",")); } StringBuilder userBuilder = new StringBuilder(); userBuilder.append("["); for (String aUser : users) { userBuilder.append('"'); userBuilder.append(aUser); userBuilder.append('"'); userBuilder.append(','); } userBuilder.append(']'); if (userBuilder.length() > 0) { if (userBuilder.charAt(userBuilder.lastIndexOf("]") - 1) == ',') { userBuilder.deleteCharAt(userBuilder.lastIndexOf("]") - 1); } } System.out.println("A new builder : " + builder.toString()); System.out.println("The Users : " + userBuilder.toString()); Map<String, String> mapResult = new HashMap<>(); mapResult.put("data", builder.toString()); mapResult.put("users", userBuilder.toString()); session.getTransaction().commit(); return mapResult; }
From source file:models.Account.java
public Accounts getRowByAccountName(String accountName) { Accounts acc = null;/*from ww w . j av a 2s .c o m*/ Session session; session = DatabaseUtil.getSessionFactory().openSession(); Transaction tx = null; try { tx = session.beginTransaction(); Criteria criteria = session.createCriteria(Accounts.class); criteria.setMaxResults(1); ProjectionList projList = Projections.projectionList(); projList.add(Projections.property("id").as("id")); projList.add(Projections.property("no").as("no")); projList.add(Projections.property("accountName").as("accountName")); criteria.setProjection(projList); criteria.addOrder(Order.asc("no")); criteria.add(Restrictions.ilike("accountName", accountName)); criteria.setResultTransformer(Transformers.aliasToBean(Accounts.class)); acc = (Accounts) criteria.uniqueResult(); tx.commit(); } catch (HibernateException ex) { if (tx != null) { tx.rollback(); } } finally { session.close(); } return acc; }
From source file:models.BeginningBalance.java
public DefaultTableModel getList(String Year, Integer offset, final Integer limit) { DefaultTableModel model = new DefaultTableModel() { @Override// w ww . j a v a2 s . c o m public String getColumnName(int column) { return TABLE_COLUMN_NAME[column]; } @Override public int getColumnCount() { return TABLE_COLUMN_NAME.length; } @Override public boolean isCellEditable(int row, int column) { return false; //To change body of generated methods, choose Tools | Templates. } }; //set to list all data Session session = DatabaseUtil.getSessionFactory().openSession(); Transaction tx = null; try { Integer i = (limit * (offset - 1)); tx = session.beginTransaction(); Criteria criteria; criteria = session.createCriteria(Accounts.class); ProjectionList projList = Projections.projectionList(); projList.add(Projections.property("id").as("id")); projList.add(Projections.property("no").as("no")); projList.add(Projections.property("name").as("name")); projList.add(Projections.property("type").as("type")); criteria.setProjection(projList); criteria.addOrder(Order.asc("no")); criteria.setFirstResult(i); criteria.setMaxResults(i + limit); criteria.setResultTransformer(Transformers.aliasToBean(Accounts.class)); List list = criteria.list(); Iterator it = list.iterator(); while (it.hasNext()) { i++; Accounts acc; acc = (Accounts) it.next(); BeginningBalance modelJoin = new BeginningBalance(); BeginningBalances bb; bb = modelJoin.getRowByIdAndYear(acc.getId(), Year); model.addRow(new Object[] { i, acc.getNo(), acc.getName(), acc.getType(), bb == null ? 0.00 : Format.currency(bb.getDebet(), 2), bb == null ? 0.00 : Format.currency(bb.getCredit(), 2), acc.getId() }); } tx.commit(); } catch (HibernateException e) { if (tx != null) { tx.rollback(); } } finally { session.close(); } return model; }
From source file:models.db.acentera.impl.ProjectProvidersImpl.java
License:Open Source License
public static Set<ProjectRegions> getRegionsAvailables(Set<ProjectProvidersRegions> regions) { Session s = (Session) HibernateSessionFactory.getSession(); DetachedCriteria msgFromCriteria = DetachedCriteria.forClass(DO_REGIONS.class); ProjectionList properties = Projections.projectionList(); properties.add(Projections.groupProperty("slug")); msgFromCriteria.setProjection(properties); Criteria criteria = s.createCriteria(DO_REGIONS.class); criteria.add(Subqueries.propertiesIn(new String[] { "slug" }, msgFromCriteria)); List<DO_REGIONS> list = criteria.list(); HashSet<ProjectRegions> regionsSet = new HashSet<ProjectRegions>(); Iterator<ProjectProvidersRegions> ppr = regions.iterator(); while (ppr.hasNext()) { ProjectProvidersRegions item = ppr.next(); boolean bFound = false; Iterator<DO_REGIONS> itrReg = list.iterator(); while (itrReg.hasNext() && !bFound) { DO_REGIONS r = itrReg.next(); try { if (r.getSlug().compareTo(item.getProjectRegions().getSlug()) == 0) { bFound = true;//from w w w. j a v a2s . co m } } catch (Exception ew) { ew.printStackTrace(); } } if (bFound) { regionsSet.add(item.getProjectRegions()); } } return regionsSet; }
From source file:net.firejack.platform.api.registry.broker.ReadBaseBIReportDataBroker.java
License:Apache License
@Override protected ServiceResponse<BIReportData> perform(ServiceRequest<NamedValues> request) throws Exception { Long biReportUserId = (Long) request.getData().get("id"); String parentNodeValues = (String) request.getData().get("parentNodeValues"); String[] parentRowValues = WebUtils.deserializeJSON(parentNodeValues, String[].class); int depth = parentRowValues.length; ServiceResponse<BIReportData> response; ServiceResponse<BIReportUser> biReportUserResponse = OPFEngine.RegistryService .readBIReportUser(biReportUserId); if (biReportUserResponse.isSuccess()) { BIReportData biReport = new BIReportData(); BIReportUser biReportUser = biReportUserResponse.getItem(); List<BIReportUserField> biReportUserFields = biReportUser.getFields(); Map<Long, BIReportField> entityBIReportFieldMap = new HashMap<Long, BIReportField>(); for (BIReportField biReportField : biReportUser.getReport().getFields()) { if (biReportField.getField() == null) { entityBIReportFieldMap.put(biReportField.getEntity().getId(), biReportField); }//from w w w . j av a 2s.c o m } Integer columnIndex = 0; List<BIReportColumn> biReportColumns = new ArrayList<BIReportColumn>(); Map<BIReportField, BIReportLocation> groupedBIReportFields = new LinkedHashMap<BIReportField, BIReportLocation>(); Map<Integer, BIReportRow> verticalColumnsMapping = new HashMap<Integer, BIReportRow>(); List<BIReportUserField> verticalBIReportUserFields = getFieldsByLocation(biReportUserFields, BIReportLocation.VERTICAL); Entity previousEntity = null; for (int i = 0; i < verticalBIReportUserFields.size(); i++) { BIReportUserField biReportUserField = verticalBIReportUserFields.get(i); BIReportField biReportField = biReportUserField.getField(); Entity entity = biReportField.getEntity(); if (previousEntity == null || !previousEntity.getId().equals(entity.getId())) { String columnName = entity.getName(); BIReportField entityBIReportField = entityBIReportFieldMap.get(entity.getId()); if (entityBIReportField != null) { columnName = StringUtils.defaultIfEmpty(entityBIReportField.getDisplayName(), columnName); } BIReportColumn biReportColumn = new BIReportColumn(); biReportColumn.setName(columnName); biReportColumn.setType(BIReportLocation.VERTICAL); biReportColumn.setColumnIndex(columnIndex); biReportColumn.setExpanded(biReportUserField.isExpanded()); biReportColumn.setUnShift(i); biReportColumns.add(biReportColumn); columnIndex++; previousEntity = entity; } BIReportRow biReportRow = new BIReportRow(); biReportRow.setColumnIndex(biReportColumns.size() - 1); biReportRow.setExpanded(biReportUserField.isExpanded()); verticalColumnsMapping.put(i, biReportRow); groupedBIReportFields.put(biReportField, BIReportLocation.VERTICAL); } biReport.setCountOfLevels(verticalColumnsMapping.size()); List<BIReportUserField> horizontalBIReportUserFields = getFieldsByLocation(biReportUserFields, BIReportLocation.HORIZONTAL); Map<Entity, List<BIReportField>> entityBIReportFields = new LinkedHashMap<Entity, List<BIReportField>>(); for (BIReportUserField biReportUserField : horizontalBIReportUserFields) { BIReportField biReportField = biReportUserField.getField(); Entity entity = biReportField.getEntity(); List<BIReportField> biReportFields = entityBIReportFields.get(entity); if (biReportFields == null) { biReportFields = new ArrayList<BIReportField>(); entityBIReportFields.put(entity, biReportFields); } biReportFields.add(biReportField); groupedBIReportFields.put(biReportField, BIReportLocation.HORIZONTAL); } List<BIReportUserField> measureBIReportUserFields = getFieldsByLocation(biReportUserFields, BIReportLocation.MEASURE); for (BIReportUserField biReportUserField : measureBIReportUserFields) { BIReportField biReportField = biReportUserField.getField(); groupedBIReportFields.put(biReportField, BIReportLocation.MEASURE); } String biReportUserFilter = biReportUser.getFilter(); biReport.setFilter(biReportUserFilter); List<List<SearchQuery>> filterSearchQueries = WebUtils.deserializeJSON(biReportUserFilter, List.class, List.class, SearchQuery.class); BIReportUserField measureBIReportUserField = measureBIReportUserFields.get(0); BIReportField measureBIReportField = measureBIReportUserField.getField(); Entity factEntity = measureBIReportField.getEntity(); String factDomainClassName = FormattingUtils.classFormatting(factEntity.getName()); String factModelClassName = factEntity.getPath() + ".model." + factDomainClassName + "Model"; Class<?> factModelClass = Class.forName(factModelClassName); List<Object[]> globalList = null; for (Map.Entry<Entity, List<BIReportField>> entry : entityBIReportFields.entrySet()) { Entity entity = entry.getKey(); List<BIReportField> biReportFields = entry.getValue(); String domainClassName = FormattingUtils.classFormatting(entity.getName()); String modelClassName = entity.getPath() + ".model." + domainClassName + "Model"; String storeClassName = entity.getPath() + ".store.Basic" + domainClassName + "Store"; IAbstractStore store = OpenFlameSpringContext.getBean(storeClassName); List<List<SearchQuery>> columnSearchQueryList = new ArrayList<List<SearchQuery>>(); List<SortField> sortFields = new ArrayList<SortField>(); ProjectionList projectionList = Projections.projectionList(); for (BIReportField biReportField : biReportFields) { Field field = biReportField.getField(); String fieldName = FormattingUtils.fieldModelFormatting(field.getName()); projectionList.add(Projections.property(fieldName)); sortFields.add(new SortField(fieldName, SortOrder.ASC)); String fkDimFieldName = findDimFieldName(factModelClass, modelClassName); for (List<SearchQuery> searchQueries : filterSearchQueries) { List<SearchQuery> columnSearchQueries = new ArrayList<SearchQuery>(); for (SearchQuery searchQuery : searchQueries) { String searchField = searchQuery.getField(); String[] fieldNames = searchField.split("\\."); if (fieldNames.length == 2 && fieldNames[0].equals(fkDimFieldName)) { SearchQuery columnSearchQuery = new SearchQuery(fieldNames[1], searchQuery.getOperation(), searchQuery.getValue()); columnSearchQueries.add(columnSearchQuery); } } if (columnSearchQueries.isEmpty()) { SearchQuery alwaysTrueSearchQuery = new SearchQuery(); columnSearchQueries.add(alwaysTrueSearchQuery); } columnSearchQueryList.add(columnSearchQueries); } } Paging paging = new Paging(null, null, sortFields); List<Object[]> objectsList; if (biReportFields.size() > 1) { objectsList = store.advancedSearchWithProjection(columnSearchQueryList, Projections.distinct(projectionList), null, paging); } else { objectsList = new ArrayList<Object[]>(); List<Object> objectList = store.advancedSearchWithProjection(columnSearchQueryList, Projections.distinct(projectionList), null, paging); for (Object object : objectList) { objectsList.add(new Object[] { object }); } } if (globalList == null) { globalList = objectsList; } else { List<Object[]> mergedList = new ArrayList<Object[]>(); for (Object[] globalObjects : globalList) { for (Object[] objects : objectsList) { Object[] mergedObjects = ArrayUtils.addAll(globalObjects, objects); mergedList.add(mergedObjects); } } globalList = mergedList; } } List<BIReportField> measureBIReportFields = getFieldsByLocation(groupedBIReportFields, BIReportLocation.MEASURE); Map<ArrayKey, Integer> horizontalColumnMapping = generateHorizontalColumns(globalList, biReportColumns, measureBIReportFields, columnIndex); if (depth == 0) { biReport.setColumns(biReportColumns); } int countOfExpandedChildren = 1; int countOfVerticalColumns = verticalColumnsMapping.size(); for (int i = depth; i < countOfVerticalColumns; i++) { BIReportRow verticalBIReportRow = verticalColumnsMapping.get(i); if (verticalBIReportRow.isExpanded()) { countOfExpandedChildren++; } else { break; } } ProjectionList projectionList = Projections.projectionList(); List<SortField> sortFields = new ArrayList<SortField>(); Map<String, String> aliases = new HashMap<String, String>(); int positionOfLastExpandedColumns = depth + countOfExpandedChildren - 1; List<SearchQuery> childrenFilterSearchQueries = new ArrayList<SearchQuery>(); List<BIReportField> verticalBIReportFields = getFieldsByLocation(groupedBIReportFields, new BIReportLocation[] { BIReportLocation.VERTICAL }); for (int i = 0; i < verticalBIReportFields.size(); i++) { BIReportField biReportField = verticalBIReportFields.get(i); Entity dimEntity = biReportField.getEntity(); String dimDomainClassName = FormattingUtils.classFormatting(dimEntity.getName()); String dimModelClassName = dimEntity.getPath() + ".model." + dimDomainClassName + "Model"; String fkDimFieldName = findDimFieldName(factModelClass, dimModelClassName); aliases.put(fkDimFieldName, fkDimFieldName); Field field = biReportField.getField(); String fieldName = FormattingUtils.fieldModelFormatting(field.getName()); String aliasedFieldName = fkDimFieldName + "." + fieldName; projectionList.add(Projections.groupProperty(aliasedFieldName)); sortFields.add(new SortField(aliasedFieldName, SortOrder.ASC)); if (positionOfLastExpandedColumns >= i + 1) { if (depth >= i + 1) { SearchQuery searchQuery = new SearchQuery(); searchQuery.setField(aliasedFieldName); searchQuery.setOperation(QueryOperation.EQUALS); searchQuery.setValue(parentRowValues[i]); childrenFilterSearchQueries.add(searchQuery); } } else { break; } } if (filterSearchQueries.isEmpty()) { filterSearchQueries.add(childrenFilterSearchQueries); } else { for (List<SearchQuery> searchQueries : filterSearchQueries) { for (SearchQuery childrenFilterSearchQuery : childrenFilterSearchQueries) { searchQueries.add(childrenFilterSearchQuery); } } } List<BIReportField> horizontalBIReportFields = getFieldsByLocation(groupedBIReportFields, new BIReportLocation[] { BIReportLocation.HORIZONTAL }); for (BIReportField biReportField : horizontalBIReportFields) { Entity dimEntity = biReportField.getEntity(); String dimDomainClassName = FormattingUtils.classFormatting(dimEntity.getName()); String dimModelClassName = dimEntity.getPath() + ".model." + dimDomainClassName + "Model"; String fkDimFieldName = findDimFieldName(factModelClass, dimModelClassName); aliases.put(fkDimFieldName, fkDimFieldName); Field field = biReportField.getField(); String fieldName = FormattingUtils.fieldModelFormatting(field.getName()); String aliasedFieldName = fkDimFieldName + "." + fieldName; projectionList.add(Projections.groupProperty(aliasedFieldName)); sortFields.add(new SortField(aliasedFieldName, SortOrder.ASC)); } for (BIReportField biReportField : measureBIReportFields) { Field field = biReportField.getField(); String fieldName = FormattingUtils.fieldModelFormatting(field.getName()); projectionList.add(Projections.count(fieldName)); } String storeClassName = factEntity.getPath() + ".store.Basic" + factDomainClassName + "Store"; IAbstractStore store = OpenFlameSpringContext.getBean(storeClassName); List<Object[]> dataList = store.advancedSearchWithProjection(filterSearchQueries, Projections.distinct(projectionList), aliases, new Paging(null, null, sortFields)); int countOfHorizontalColumns = horizontalBIReportUserFields.size(); int countOfMeasureColumns = measureBIReportUserFields.size(); List<BIReportRow> biReportRows = generateRows(dataList, verticalColumnsMapping, horizontalColumnMapping, countOfVerticalColumns, countOfHorizontalColumns, countOfMeasureColumns, depth, countOfExpandedChildren); biReport.setRows(biReportRows); response = new ServiceResponse<BIReportData>(biReport, "BI Report data", true); } else { response = new ServiceResponse<BIReportData>( "Could not find user configuration of BIReport by ID: " + biReportUserId, false); } return response; }
From source file:net.firejack.platform.core.store.AbstractStore.java
License:Apache License
@Override @Transactional(readOnly = true)/*from w ww .j a v a 2s.c o m*/ public <I extends Serializable> Map<I, ID> searchKeys(String key, Collection<I> values) { if (!values.isEmpty()) { Criteria criteria = getSession().createCriteria(getClazz()); criteria.add(generateInRestriction(key, values)); ProjectionList projectionList = Projections.projectionList(); projectionList.add(Projections.property(key)); projectionList.add(Projections.id()); criteria.setProjection(projectionList); List<Object[]> list = (List<Object[]>) criteria.list(); Map<I, ID> search = new HashMap<I, ID>(list.size()); for (Object[] item : list) { search.put((I) item[0], (ID) item[1]); } return search; } return Collections.emptyMap(); }
From source file:net.firejack.platform.core.store.BaseTreeStore.java
License:Apache License
@Override @SuppressWarnings("unchecked") @Transactional(readOnly = true)/* ww w . ja v a2s . co m*/ public List<Object[]> findAllIdAndParentId() { final O example = instantiate(); return getHibernateTemplate().executeFind(new HibernateCallback<List<Object[]>>() { @Override public List<Object[]> doInHibernate(Session session) throws HibernateException, SQLException { Criteria criteria = session.createCriteria(example.getClass()); ProjectionList proList = Projections.projectionList(); proList.add(Projections.property("id")); proList.add(Projections.property("parent.id")); criteria.setProjection(proList); return criteria.list(); } }); }
From source file:net.firejack.platform.core.store.registry.EntityStore.java
License:Apache License
@Override @SuppressWarnings("unchecked") @Transactional(readOnly = true)/*w w w . j av a 2s.c o m*/ public List<Object[]> findAllIdAndExtendedId() { return getHibernateTemplate().executeFind(new HibernateCallback<List<Object[]>>() { @Override public List<Object[]> doInHibernate(Session session) throws HibernateException, SQLException { Criteria criteria = session.createCriteria(EntityModel.class); criteria.add(Restrictions.isNotNull("extendedEntity.id")); ProjectionList proList = Projections.projectionList(); proList.add(Projections.property("id")); proList.add(Projections.property("extendedEntity.id")); criteria.setProjection(proList); return criteria.list(); } }); }
From source file:net.firejack.platform.core.store.registry.resource.ResourceStore.java
License:Apache License
@Override @Transactional//from w ww .j a va 2s .co m public Integer setMaxResourceVersion(final R resource) { Integer maxVersion = getHibernateTemplate().execute(new HibernateCallback<Integer>() { public Integer doInHibernate(Session session) throws HibernateException, SQLException { Criteria criteria = session.createCriteria(AbstractResourceVersionModel.class); criteria.add(Restrictions.eq("resource.id", resource.getId())); criteria.add(Restrictions.le("version", resource.getLastVersion())); ProjectionList projectionList = Projections.projectionList(); projectionList.add(Projections.max("version")); criteria.setProjection(projectionList); return (Integer) criteria.uniqueResult(); } }); resource.setLastVersion(maxVersion); if (resource.getPublishedVersion() != null && resource.getPublishedVersion() > maxVersion) { resource.setPublishedVersion(maxVersion); } update(resource); return maxVersion; }