@SuppressWarnings({"rawtypes", "deprecation"}) @Override public int getUndownloadUserAmountByApplicationVersionWithCardSecurityDomain( ApplicationVersion applicationVersion) { long appVerId = applicationVersion.getId(); long appId = applicationVersion.getApplication().getId(); String sql = " SELECT a.card_id "; sql += " FROM card_security_domain a"; sql += " WHERE NOT EXISTS"; sql += " (SELECT 1"; sql += " FROM card_application b"; sql += " WHERE a.card_id = b.card_info_id"; sql += " AND b.application_version_id = " + appVerId; sql += " AND b.status IN (" + CardApplication.STATUS_AVAILABLE + "," + CardApplication.STATUS_LOCKED + "," + CardApplication.STATUS_PERSONALIZED + "," + CardApplication.STATUS_AVAILABLE + ")"; sql += " )"; sql += " AND EXISTS"; sql += " (SELECT 1 FROM application c WHERE a.security_id = c.sd_id AND c.id = " + appId; sql += " )"; Session session = this.getSession(); List list = session.createSQLQuery(sql).addScalar("card_id", Hibernate.LONG).list(); if (list.isEmpty()) return 0; List<Long> cardIdList = new ArrayList<Long>(); for (int index = 0; index < list.size(); index++) { Long cardId = (Long) list.get(index); String check = "SELECT COUNT(1) amount FROM card_application a WHERE EXISTS (SELECT 1 FROM application_version b WHERE a.application_version_id = b.id AND b.application_id = " + appId + " ) AND a.card_info_id = " + cardId + " AND a.application_version_id != " + appVerId + " AND a.status IN (" + CardApplication.STATUS_LOCKED + "," + CardApplication.STATUS_AVAILABLE + "," + CardApplication.STATUS_PERSONALIZED + ")"; List l = session.createSQLQuery(check).addScalar("amount", Hibernate.LONG).list(); long size = (Long) l.get(0); if (size > 0) continue; cardIdList.add(cardId); } if (cardIdList.isEmpty()) return 0; String cardIds = ""; for (Long id : cardIdList) { cardIds += "," + id; } cardIds = cardIds.replaceFirst(",", ""); String query = " SELECT COUNT(1) amount "; query += " FROM "; query += " (SELECT a.card_id, "; query += " a.free_non_volatile_space ram, "; query += " a.free_volatile_space rom "; query += " FROM card_security_domain a "; query += " WHERE a.card_id IN (" + cardIds + ") "; query += " AND EXISTS "; query += " (SELECT 1 FROM application c WHERE a.security_id = c.sd_id AND c.id = " + appId + ") "; query += " ) a, "; query += " application_version b "; query += " WHERE b.id = " + appVerId; query += " AND a.ram >= b.non_volatile_space "; query += " AND a.rom >= b.volatile_space "; this.logger.debug("\n\n" + query + "\n\n"); return getUndownloadUserAmountByApplicationVersion(query); }