/* * eGov suite of products aim to improve the internal efficiency,transparency, * accountability and the service delivery of the government organizations. * * Copyright (C) <2015> eGovernments Foundation * * The updated version of eGov suite of products as by eGovernments Foundation * is available at http://www.egovernments.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/ or * http://www.gnu.org/licenses/gpl.html . * * In addition to the terms of the GPL license to be adhered to in using this * program, the following additional terms are to be complied with: * * 1) All versions of this program, verbatim or modified must carry this * Legal Notice. * * 2) Any misrepresentation of the origin of the material is prohibited. It * is required that all modified versions of this material be marked in * reasonable ways as different from the original version. * * 3) This license does not grant any rights to any user of the program * with regards to rights under trademark law for use of the trade names * or trademarks of eGovernments Foundation. * * In case of any queries, you can reach eGovernments Foundation at contact@egovernments.org. */ package org.egov.commons.dao; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import org.egov.commons.Accountdetailtype; import org.egov.commons.CChartOfAccounts; import org.egov.infra.exception.ApplicationException; import org.egov.infra.exception.ApplicationRuntimeException; import org.egov.infra.validation.exception.ValidationError; import org.egov.infra.validation.exception.ValidationException; import org.egov.infstr.services.PersistenceService; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; @Repository public class ChartOfAccountsHibernateDAO implements ChartOfAccountsDAO { @Autowired @Qualifier("persistenceService") private PersistenceService persistenceService; @Transactional public CChartOfAccounts update(final CChartOfAccounts entity) { getCurrentSession().update(entity); return entity; } @Transactional public CChartOfAccounts create(final CChartOfAccounts entity) { getCurrentSession().persist(entity); return entity; } @Transactional public void delete(CChartOfAccounts entity) { getCurrentSession().delete(entity); } public CChartOfAccounts findById(Number id, boolean lock) { return (CChartOfAccounts) getCurrentSession().load(CChartOfAccounts.class, id); } @Override public List<CChartOfAccounts> findAll() { return (List<CChartOfAccounts>) getCurrentSession().createCriteria(CChartOfAccounts.class).list(); } @PersistenceContext private EntityManager entityManager; public Session getCurrentSession() { return entityManager.unwrap(Session.class); } private final static Logger LOG = Logger.getLogger(ChartOfAccountsHibernateDAO.class); @Deprecated public Collection getAccountCodeListForDetails() { return getCurrentSession() .createQuery( "select acc from CChartOfAccounts acc where acc.classification='4' and acc.isActiveForPosting=true order by acc.glcode") .list(); } /** * This API will give the list of detailed active for posting chartofaccounts list * * @return * @throws ApplicationException */ public List<CChartOfAccounts> getDetailedAccountCodeList() { return getCurrentSession() .createQuery( "select acc from CChartOfAccounts acc where acc.classification='4' and acc.isActiveForPosting=true order by acc.glcode") .setCacheable(true).list(); } public List<CChartOfAccounts> getDetailedCodesList() { return getCurrentSession() .createQuery( "from CChartOfAccounts where classification=4") .setCacheable(true).list(); } public List<CChartOfAccounts> findDetailedAccountCodesByGlcodeOrNameLike(String searchString) { final Query qry = getCurrentSession() .createQuery( "from CChartOfAccounts where classification='4' and isActiveForPosting=true and (glcode like :glCode or upper(name) like :name) order by glcode"); qry.setString("glCode", searchString + "%"); qry.setString("name", "%" + searchString.toUpperCase() + "%"); return (List<CChartOfAccounts>) qry.list(); } @Deprecated public CChartOfAccounts findCodeByPurposeId(final int purposeId) { final Query qry = getCurrentSession().createQuery( "select acc from CChartOfAccounts acc where acc.purposeId=:purposeId "); qry.setLong("purposeId", purposeId); return (CChartOfAccounts) qry.uniqueResult(); } public CChartOfAccounts getCChartOfAccountsByGlCode(final String glCode) { final Query qry = getCurrentSession().createQuery("from CChartOfAccounts coa where coa.glcode =:glCode"); qry.setString("glCode", glCode); return (CChartOfAccounts) qry.uniqueResult(); } @Deprecated public List getChartOfAccountsForTds() { final Query qry = getCurrentSession().createQuery( "from CChartOfAccounts coa where purposeId = 10 order by glcode"); return qry.list(); } @Deprecated public int getDetailTypeId(final String glCode, final Connection connection) throws Exception { int detailTypeId = 0; ResultSet rs; String qryDetailType = "Select detailtypeid from chartofaccountdetail where glcodeid=(select id from chartofaccounts where glcode=?)"; PreparedStatement st = connection.prepareStatement(qryDetailType); st.setString(1, glCode); rs = st.executeQuery(); if (rs.next()) { detailTypeId = rs.getInt(1); } rs.close(); st.close(); return detailTypeId; } @Deprecated public int getDetailTypeIdByName(final String glCode, final Connection connection, final String name) { final SQLQuery query = persistenceService .getSession() .createSQLQuery( "SELECT a.ID FROM accountdetailtype a,chartofaccountdetail coad WHERE coad.DETAILTYPEID =a.ID AND coad.glcodeid=(SELECT ID FROM chartofaccounts WHERE glcode=:glCode) AND a.NAME=:name"); query.setString("glCode", glCode); query.setString("name", name); List accountDtlTypeList = query.list(); return (accountDtlTypeList != null) && (accountDtlTypeList.size() != 0) ? Integer.valueOf(accountDtlTypeList .get(0).toString()) : 0; } /** * This API will return the accountdetailtype for an account code when the accountcode and the respective accountdetailtype * name is passed. * * @param glcode - This the chartofaccount code (mandatory) * @param name - This is the accountdetailtype name that is associated with the account code (mandatory) * @return - Returns the accountdetailtype object if the account code is having the passed accountdetailtype name, else NULL */ public Accountdetailtype getAccountDetailTypeIdByName(final String glCode, final String name) { if (StringUtils.isBlank(name) || StringUtils.isBlank(glCode)) { throw new ApplicationRuntimeException("Account Code or Account Detail Type Name is empty"); } Query query = getCurrentSession().createQuery("from CChartOfAccounts where glcode=:glCode"); query.setString("glCode", glCode); if (query.list().isEmpty()) { throw new ApplicationRuntimeException("GL Code not found in Chart of Accounts"); } query = getCurrentSession() .createQuery( "from Accountdetailtype where id in (select cd.detailTypeId from " + "CChartOfAccountDetail as cd,CChartOfAccounts as c where cd.glCodeId=c.id and c.glcode=:glCode) and name=:name"); query.setString("glCode", glCode); query.setString("name", name); return (Accountdetailtype) query.uniqueResult(); } public List getGlcode(final String minGlcode, final String maxGlcode, final String majGlcode) { Query qry = null; final StringBuilder qryStr = new StringBuilder("select coa.glcode from CChartOfAccounts coa where "); if (StringUtils.isNotBlank(minGlcode) && StringUtils.isNotBlank(maxGlcode)) { qryStr.append(" coa.glcode between :minGlcode and :maxGlcode "); qry = getCurrentSession().createQuery(qryStr.toString()); qry.setString("minGlcode", minGlcode + "%"); qry.setString("maxGlcode", maxGlcode + "%"); } else if (StringUtils.isNotBlank(maxGlcode)) { qryStr.append(" coa.glcode like :maxGlcode "); qry = getCurrentSession().createQuery(qryStr.toString()); qry.setString("maxGlcode", maxGlcode + "%"); } else if (StringUtils.isNotBlank(majGlcode)) { qryStr.append(" coa.glcode =:majGlcode "); qry = getCurrentSession().createQuery(qryStr.toString()); qry.setString("majGlcode", majGlcode); } return qry == null ? null : qry.list(); } /** * This API will return the list of detailed chartofaccounts objects that are active for posting for the Type. * * @param -Accounting type-(Asset (A), Liability (L), Income (I), Expense (E)) * @return list of chartofaccount objects */ public List<CChartOfAccounts> getActiveAccountsForType(final char type) { final Query query = getCurrentSession() .createQuery( "select acc from CChartOfAccounts acc where acc.classification='4' and acc.isActiveForPosting=true and type=:type order by acc.name"); query.setCharacter("type", type); return query.list(); } /** * to get the list of chartofaccounts based on the purposeId. First query will get the detail codes for the purpose is mapped * to major code level. second query will get the detail codes for the purpose is mapped to minor code level. last one will * get the detail codes are mapped to the detail code level. * * @param purposeId * @return list of COA object(s) */ public List<CChartOfAccounts> getAccountCodeByPurpose(final Integer purposeId) { final List<CChartOfAccounts> accountCodeList = new ArrayList<CChartOfAccounts>(); try { if ((purposeId == null) || (purposeId.intValue() == 0)) { throw new ApplicationException("Purpose Id is null or zero"); } Query query = getCurrentSession().createQuery( " from EgfAccountcodePurpose purpose where purpose.id=" + purposeId + ""); if (query.list().size() == 0) { throw new ApplicationException("Purpose ID provided is not defined in the system"); } query = persistenceService .getSession() .createQuery( " FROM CChartOfAccounts WHERE parentId IN (SELECT id FROM CChartOfAccounts WHERE parentId IN (SELECT id FROM CChartOfAccounts WHERE parentId IN (SELECT id FROM CChartOfAccounts WHERE purposeid=:purposeId))) AND classification=4 AND isActiveForPosting=true "); query.setLong("purposeId", purposeId); accountCodeList.addAll((List<CChartOfAccounts>) query.list()); query = persistenceService .getSession() .createQuery( " FROM CChartOfAccounts WHERE parentId IN (SELECT id FROM CChartOfAccounts WHERE parentId IN (SELECT id FROM CChartOfAccounts WHERE purposeid=:purposeId)) AND classification=4 AND isActiveForPosting=true "); query.setLong("purposeId", purposeId); accountCodeList.addAll((List<CChartOfAccounts>) query.list()); query = persistenceService .getSession() .createQuery( " FROM CChartOfAccounts WHERE parentId IN (SELECT id FROM CChartOfAccounts WHERE purposeid=:purposeId) AND classification=4 AND isActiveForPosting=true "); query.setLong("purposeId", purposeId); accountCodeList.addAll((List<CChartOfAccounts>) query.list()); query = getCurrentSession() .createQuery( " FROM CChartOfAccounts WHERE purposeid=:purposeId AND classification=4 AND isActiveForPosting=true "); query.setLong("purposeId", purposeId); accountCodeList.addAll((List<CChartOfAccounts>) query.list()); } catch (final Exception e) { LOG.error(e); throw new ApplicationRuntimeException("Error occurred while getting Account Code by purpose", e); } return accountCodeList; } /** * This API will return the list of non control detailed chartofaccount codes that are active for posting. * * @return list of chartofaccount objects. */ public List<CChartOfAccounts> getNonControlCodeList() { try { return getCurrentSession() .createQuery( " from CChartOfAccounts acc where acc.classification=4 and acc.isActiveForPosting=true and acc.id not in (select cd.glCodeId from CChartOfAccountDetail cd) ") .list(); } catch (final Exception e) { LOG.error(e); throw new ApplicationRuntimeException("Error occurred while getting Non-Control Code list", e); } } /** * @description- This method returns a list of detail type object based on the glcode. * @param glCode - glcode supplied by the client. * @return List<Accountdetailtype> -list of Accountdetailtype object(s). * @throws ApplicationException */ @SuppressWarnings("unchecked") public List<Accountdetailtype> getAccountdetailtypeListByGLCode(final String glCode) { if (StringUtils.isBlank(glCode)) { throw new ApplicationRuntimeException("GL Code is empty "); } // checking if the glcode is exists in ChartOfAccounts table. CChartOfAccounts cChartOfAccountsByGlCode = getCChartOfAccountsByGlCode(glCode); if (cChartOfAccountsByGlCode == null) { throw new ApplicationRuntimeException("GL Code not found in Chart of Accounts"); } try { Query query = persistenceService .getSession() .createQuery( "from Accountdetailtype where id in (select cd.detailTypeId " + "from CChartOfAccountDetail as cd,CChartOfAccounts as c where cd.glCodeId=c.id and c.glcode=:glCode)"); query.setString("glCode", glCode); query.setCacheable(true); return query.list().isEmpty() ? null : query.list(); // NOPMD } catch (final Exception e) { LOG.error(e); throw new ApplicationRuntimeException("Error occured while getting Account Detail Types for GL Code ", e); } } /** * @author manoranjan * @description -Get list of COA for a list of types. * @param type - list of types,e.g income, Assets etc. * @return listChartOfAcc - list of chartofaccounts based on the given list of types * @throws ValidationException */ public List<CChartOfAccounts> getActiveAccountsForTypes(final char[] type) throws ValidationException { if ((null == type) || (type.length == 0)) { throw new ValidationException(Arrays.asList(new ValidationError("type", "The supplied value for Chart of Account Type can not be null or empty"))); } final Character[] types = new Character[type.length]; int count = 0; for (final char typ : type) { types[count++] = typ; } final Query query = getCurrentSession().createQuery( "from CChartOfAccounts where classification=4 " + "and isActiveForPosting=true and type in (:type)"); query.setParameterList("type", types); query.setCacheable(true); return query.list(); } /** * @author manoranjan * @description - Get list of Chartofaccount objects for a list of purpose ids * @param purposeId - list of purpose ids. * @return listChartOfAcc - list of chartofaccount objects for the given list of purpose id * @throws ValidationException */ public List<CChartOfAccounts> getAccountCodeByListOfPurposeId(final Integer[] purposeId) throws ValidationException { if ((null == purposeId) || (purposeId.length == 0)) { throw new ValidationException(Arrays.asList(new ValidationError("purposeId", "The supplied purposeId can not be null or empty"))); } final List<CChartOfAccounts> listChartOfAcc = new ArrayList<CChartOfAccounts>(); Query query = getCurrentSession() .createQuery( " FROM CChartOfAccounts WHERE purposeid in(:purposeId)AND classification=4 AND isActiveForPosting=true "); query.setParameterList("purposeId", purposeId); query.setCacheable(true); listChartOfAcc.addAll(query.list()); query = persistenceService .getSession() .createQuery( " from CChartOfAccounts where parentId IN (select id FROM CChartOfAccounts WHERE purposeid in (:purposeId) ) AND classification=4 AND isActiveForPosting=true "); query.setParameterList("purposeId", purposeId); query.setCacheable(true); listChartOfAcc.addAll(query.list()); query = persistenceService .getSession() .createQuery( " from CChartOfAccounts where parentId IN (select id from CChartOfAccounts where parentId IN (select id FROM CChartOfAccounts WHERE purposeid in (:purposeId))) AND classification=4 AND isActiveForPosting=true"); query.setParameterList("purposeId", purposeId); query.setCacheable(true); listChartOfAcc.addAll(query.list()); query = persistenceService .getSession() .createQuery( " from CChartOfAccounts where parentId IN (select id from CChartOfAccounts where parentId IN (select id from CChartOfAccounts where parentId IN (select id FROM CChartOfAccounts WHERE purposeid in (:purposeId)))) AND classification=4 AND isActiveForPosting=true "); query.setParameterList("purposeId", purposeId); query.setCacheable(true); listChartOfAcc.addAll(query.list()); return listChartOfAcc; } /** * @author manoranjan * @description - This api will return the list of detailed chartofaccounts objects that are active for posting. * @param glcode - The input is the chartofaccounts code. */ public List<CChartOfAccounts> getListOfDetailCode(final String glCode) throws ValidationException { if (StringUtils.isBlank(glCode)) { throw new ValidationException(Arrays.asList(new ValidationError("glcode null", "the glcode value supplied can not be null or blank"))); } Query query = getCurrentSession().createQuery("from CChartOfAccounts where glcode=:glCode"); query.setString("glCode", glCode); query.setCacheable(true); if (query.list().isEmpty()) { throw new ValidationException(Arrays.asList(new ValidationError("glcode not exist", "The GL Code value supplied does not exist in the System"))); } final List<CChartOfAccounts> listChartOfAcc = new ArrayList<CChartOfAccounts>(); query = getCurrentSession().createQuery( " FROM CChartOfAccounts WHERE glcode=:glCode AND classification=4 AND isActiveForPosting=true "); query.setString("glCode", glCode); query.setCacheable(true); listChartOfAcc.addAll(query.list()); query = getCurrentSession() .createQuery( " from CChartOfAccounts where parentId IN (select id FROM CChartOfAccounts WHERE glcode=:glCode) AND classification=4 AND isActiveForPosting=true "); query.setString("glCode", glCode); query.setCacheable(true); listChartOfAcc.addAll(query.list()); query = getCurrentSession() .createQuery( " from CChartOfAccounts where parentId IN (select id from CChartOfAccounts where parentId IN ( select id FROM CChartOfAccounts WHERE glcode=:glCode)) AND classification=4 AND isActiveForPosting=true "); query.setString("glCode", glCode); query.setCacheable(true); listChartOfAcc.addAll(query.list()); query = getCurrentSession() .createQuery( " from CChartOfAccounts where parentId IN (select id from CChartOfAccounts where parentId IN (select id from CChartOfAccounts where parentId IN ( select id FROM CChartOfAccounts WHERE glcode=:glCode)))AND classification=4 AND isActiveForPosting=true "); query.setString("glCode", glCode); query.setCacheable(true); listChartOfAcc.addAll(query.list()); return listChartOfAcc; } public List<CChartOfAccounts> getBankChartofAccountCodeList() { return getCurrentSession().createQuery("select chartofaccounts from Bankaccount").setCacheable(true).list(); } @Override public List<CChartOfAccounts> findByType(Character type) { final Query query = getCurrentSession().createQuery( "from CChartOfAccounts where " + "type =:type and classification=1"); query.setCharacter("type", type); // query.setCacheable(true); return query.list(); } @Override public List<CChartOfAccounts> findByMajorCodeAndClassification(String majorCode, Long classification) { final Query query = getCurrentSession().createQuery( "from CChartOfAccounts where " + "majorcode =:majorcode and classification=2"); query.setString("majorcode", majorCode); // query.setCacheable(true); return query.list(); } @Override public List<CChartOfAccounts> findByGlcodeLikeIgnoreCaseAndClassificationAndMajorCode(String string, Long classification, String majorCode) { return null; } @Override public List<CChartOfAccounts> findByGlcodeLikeIgnoreCaseAndClassification(String string, Long classification) { return null; } public List<CChartOfAccounts> getBySubLedgerCode(String subLedgerCode) { final Query query = persistenceService .getSession() .createQuery( "from CChartOfAccounts where id in (select glCodeId.id from CChartOfAccountDetail where lower(detailTypeId.name) =:subLedgerCode ) and type = 'L' and classification=4 and isActiveForPosting = true and id not in (select chartofaccounts.id from Recovery)"); query.setString("subLedgerCode", subLedgerCode.toLowerCase()); return query.list(); } public List<CChartOfAccounts> getForRecovery() { final Query query = persistenceService.getSession().createQuery( "from CChartOfAccounts where id in (select chartofaccounts.id from Recovery)"); return query.list(); } /** * to get the list of chartofaccounts based on the purposeName. First query will get the detail codes for the purpose is * mapped to major code level. second query will get the detail codes for the purpose is mapped to minor code level. last one * will get the detail codes are mapped to the detail code level. * * @param purposeId * @return list of COA object(s) */ public List<CChartOfAccounts> getAccountCodeByPurposeName(final String purposeName) { final List<CChartOfAccounts> accountCodeList = new ArrayList<CChartOfAccounts>(); try { if ((purposeName == null) || purposeName.equalsIgnoreCase("")) { throw new ApplicationException("Purpose Name is null or empty"); } Query query = getCurrentSession().createQuery( " from EgfAccountcodePurpose purpose where purpose.name='" + purposeName + "'"); if (query.list().size() == 0) { throw new ApplicationException("Purpose ID provided is not defined in the system"); } query = persistenceService .getSession() .createQuery( " FROM CChartOfAccounts WHERE parentId IN (SELECT id FROM CChartOfAccounts WHERE parentId IN (SELECT id FROM CChartOfAccounts WHERE parentId IN (SELECT coa.id FROM CChartOfAccounts coa,EgfAccountcodePurpose purpose WHERE coa.purposeId=purpose.id and purpose.name = :purposeName))) AND classification=4 AND isActiveForPosting=true "); query.setString("purposeName", purposeName); accountCodeList.addAll((List<CChartOfAccounts>) query.list()); query = persistenceService .getSession() .createQuery( " FROM CChartOfAccounts WHERE parentId IN (SELECT id FROM CChartOfAccounts WHERE parentId IN (SELECT coa.id FROM CChartOfAccounts coa,EgfAccountcodePurpose purpose WHERE coa.purposeId=purpose.id and purpose.name = :purposeName)) AND classification=4 AND isActiveForPosting=true "); query.setString("purposeName", purposeName); accountCodeList.addAll((List<CChartOfAccounts>) query.list()); query = persistenceService .getSession() .createQuery( " FROM CChartOfAccounts WHERE parentId IN (SELECT coa.id FROM CChartOfAccounts coa,EgfAccountcodePurpose purpose WHERE coa.purposeId=purpose.id and purpose.name = :purposeName) AND classification=4 AND isActiveForPosting=true "); query.setString("purposeName", purposeName); accountCodeList.addAll((List<CChartOfAccounts>) query.list()); query = getCurrentSession() .createQuery( "SELECT coa FROM CChartOfAccounts coa,EgfAccountcodePurpose purpose WHERE coa.purposeId=purpose.id and purpose.name = :purposeName AND coa.classification=4 AND coa.isActiveForPosting=true "); query.setString("purposeName", purposeName); accountCodeList.addAll((List<CChartOfAccounts>) query.list()); } catch (final Exception e) { LOG.error(e); throw new ApplicationRuntimeException("Error occurred while getting Account Code by purpose", e); } return accountCodeList; } /** * @description - Get list of Chartofaccount objects for a list of purpose names * @param purposeNames - list of purpose names. * @return listChartOfAcc - list of chartofaccount objects for the given list of purpose names * @throws ValidationException */ public List<CChartOfAccounts> getAccountCodeByListOfPurposeName(final String[] purposeNames) throws ValidationException { if ((null == purposeNames) || (purposeNames.length == 0)) { throw new ValidationException(Arrays.asList(new ValidationError("purposeId", "The supplied purposeId can not be null or empty"))); } final List<CChartOfAccounts> listChartOfAcc = new ArrayList<CChartOfAccounts>(); Query query = getCurrentSession() .createQuery( "SELECT coa FROM CChartOfAccounts coa,EgfAccountcodePurpose purpose WHERE coa.purposeId = purpose.id and purpose.name in(:purposeNames)AND coa.classification=4 AND coa.isActiveForPosting=true "); query.setParameterList("purposeNames", purposeNames); query.setCacheable(true); listChartOfAcc.addAll(query.list()); query = persistenceService .getSession() .createQuery( " from CChartOfAccounts where parentId IN (select coa.id FROM CChartOfAccounts coa,EgfAccountcodePurpose purpose WHERE coa.purposeId = purpose.id and purpose.name in (:purposeNames) ) AND classification=4 AND isActiveForPosting=true "); query.setParameterList("purposeNames", purposeNames); query.setCacheable(true); listChartOfAcc.addAll(query.list()); query = persistenceService .getSession() .createQuery( " from CChartOfAccounts where parentId IN (select id from CChartOfAccounts where parentId IN (select coa.id FROM CChartOfAccounts coa,EgfAccountcodePurpose purpose WHERE coa.purposeId = purpose.id and purpose.name in (:purposeNames) )) AND classification=4 AND isActiveForPosting=true"); query.setParameterList("purposeNames", purposeNames); query.setCacheable(true); listChartOfAcc.addAll(query.list()); query = persistenceService .getSession() .createQuery( " from CChartOfAccounts where parentId IN (select id from CChartOfAccounts where parentId IN (select id from CChartOfAccounts where parentId IN (select coa.id FROM CChartOfAccounts coa,EgfAccountcodePurpose purpose WHERE coa.purposeId = purpose.id and purpose.name in (:purposeNames) ))) AND classification=4 AND isActiveForPosting=true "); query.setParameterList("purposeNames", purposeNames); query.setCacheable(true); listChartOfAcc.addAll(query.list()); return listChartOfAcc; } public List<CChartOfAccounts> getAccountCodesListForBankEntries() { return getCurrentSession() .createQuery( "select acc from CChartOfAccounts acc where acc.isActiveForPosting=true and (acc.glcode like '1%' or acc.glcode like '2%') and acc.id not in (select cd.glCodeId from CChartOfAccountDetail cd) order by acc.glcode") .setCacheable(true).list(); } }