[Resolvido] java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!

Olá pessoal,

Ao executar meu método, está occorendo o seguinte: java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!

public static List<DominioValor> findDomainValuesByDomainName(SessionImplementor session, String domainName, Boolean onlyActive, boolean sortValues) {
    	Validate.notNull(session, "session não pode ser null");

    	StringBuffer hql = new StringBuffer(defaultHQL);

        if (sortValues) {
        	hql.append(" order by dv.ordem");
        }

        Query query = ((AbstractSessionImpl)session).createQuery(hql.toString());
        query.setCacheable(true);
        query.setCacheRegion(CACHE_DOMAIN_VALUES_REGION_NAME);
        query.setParameter("domainName", domainName);

        if (onlyActive != null) {
        	hql.append(" and dv.ativo=?");
            [b]query.setParameter(1, onlyActive);  //O erro ocorre aqui[/b]
    	}

        return query.list();
    
    }

Estou setando o parametro de forma errada? :roll:

Obrigada!

O comando createQuery em

Query query = ((AbstractSessionImpl)session).createQuery(hql.toString()); compilará a tua query a partir da String, e a deixará preparada.

O

hql.append(" and dv.ativo=?"); só adiciona essa String ao final da anterior, mas não mudará em nada a query. Ela já está estática e imutável.

Já que não muda,

query.setParameter(1, onlyActive); não vai adiantar, pois não há parâmetros a serem preenchidos.

A solução é adicionar a String antes desta ser compilada, e preencher os parâmetros depois.

public static List<DominioValor> findDomainValuesByDomainName(SessionImplementor session, String domainName, Boolean onlyActive, boolean sortValues) {
    	Validate.notNull(session, "session não pode ser null");

    	StringBuffer hql = new StringBuffer(defaultHQL);

        if (onlyActive != null) {
        	hql.append(" and dv.ativo=?");
        }

        if (sortValues) {
        	hql.append(" order by dv.ordem");
        }

        Query query = ((AbstractSessionImpl)session).createQuery(hql.toString());
        query.setCacheable(true);
        query.setCacheRegion(CACHE_DOMAIN_VALUES_REGION_NAME);
        query.setParameter("domainName", domainName);

        if (onlyActive != null) {
            query.setParameter(1, onlyActive);
        }
    	
        return query.list();
    }

Olá renrutal !

Muito obrigada pela explicação!
Funcionou direitinho! :smiley: