Spring Data JPA não está utilizando índice da tabela [RESOLVIDO]

Galera,

 Alguém pode me ajudar com esta situação?: Tenho uma aplicação web que utiliza Spring Data JPA. Tenho uma tabela onde há alguns índices simples em alguns campos. O que está acontecendo é que o JPA não está utilizando o índice em um determinado campo. E em outro ele utiliza normalmente. A aplicação está funcionando perfeitamente, porém tenho esse empecilho. Por exemplo, tenho os campos CAMPO1 e CAMPO2. Ambos com índices cada. Se a consulta é realizada utilizando o CAMPO1 é utilizado o índice e a consulta se torna rápida, porém ao se utilizar o CAMPO2 não é utilizando índice e a consulta fica mais lenta. A consulta é montada em tempo de execução com base nos parâmetros que o usuário informar. Ele pode informar os dois campos citados e é utilizado o índice do CAMPO1.

 Se alguém souber se há como imprimir no log também alguma informação de que a consulta está utilizando qual índice, também ficaria grato.

 Outra coisa, se é possível forçar, através de anotações por exemplo, o uso do índice de determinado campo.

Grato pela apoio.

Spring Data JPA - 1.0.2
Hibernate 3.5.0

Galera,

Com a ajuda da equipe de DBA consegui identificar que o campo, por se tratar de um campo varchar, não estava sendo delimitado com as aspas simples pelo JPA como deveria.
Dessa forma, o banco não utiliza o índice desse campo.
Estou utilizando a Specifications do Spring para gerar uma consulta dinâmica. E como é a primeira vez que a utilizo, tenho o seguinte método e gostaria de a avaliação de vocês quanto a melhor maneira de implementação.

public List<MinhaTabela> buscar(final Entidade campo1, final Entidade campo2, final List<String> campo3, final String campo4,
			final String campo5, final Date campo6, final Date campo7, final Date campo8,
			final Date campo9, final String campo10, final Produto campo11){
		
		Specification<MinhaTabela> spec = new Specification<MinhaTabela>() {
			@Override
			public Predicate toPredicate(Root<MinhaTabela> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
				Predicate p1 = null, p2 = null, p3 = null, p4 = null, p5 = null, p6 = null, p7 = null, p8 = null, p9 = null, p10 = null, p11 = null;
				
				p1 = cb.equal(root.get(MinhaTabela_.campo1), campo1.getProcessador().getCod());
				if(campo2 != null){
					p2 = cb.equal(root.get(MinhaTabela_.campo2), campo2.getProcessador().getCod());
				}
				if(campo3 != null && !campo3.isEmpty()){
					p3 = root.get(MinhaTabela_.campo3).in(campo3);						
				}
				if(campo4 != null){
					p4 = cb.equal(root.get(MinhaTabela_.campo4), campo4);
				}
				if(campo5 != null){
					p5 = cb.equal(root.get(MinhaTabela_.campo5), campo5);
				}
				if(campo6 != null){
					p6 = cb.greaterThanOrEqualTo(root.get(MinhaTabela_.campo6), campo6);
				}
				if(campo7 != null){
					p7 = cb.lessThanOrEqualTo(root.get(MinhaTabela_.campo7), campo7);
				}
				if(campo8 != null){
					p8 = cb.equal(root.get(MinhaTabela_.campo8), campo8);
				}
				if(campo9 != null){
					p9 = cb.equal(root.get(MinhaTabela_.campo9), campo9);
				}
				if(campo10 != null){
					p10 = cb.equal(root.get(MinhaTabela_.campo10), campo10);					
				}
				if(campo11 != null){
					p11 = cb.equal(root.get(MinhaTabela_.campo11), campo11.getCod());					
				}
				
				return cb.and(verifyNotNull(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11));
			}
		};

		return transacaoRepository.findAll(spec);
	}
O campo4, que é uma String, possui um índice. Porém da maneira que está, o framework não está enviando o valor do campo com as aspas. Isso faz com que o banco não utilize o índice.
Se alguém souber uma forma para contornar isso agradeço.

utiliza o @Query ou seja:

@Query(value="SELECT t FROM Tabela t WHERE t.campo4 = TO_CHAR(:campo4)")
List<Table> findByCampo4(@Param("campo4") Long campo4);

ou teste:

@Query(value="SELECT t FROM Tabela t WHERE t.campo4 = :campo4")
List<Table> findByCampo4(String campo4);

[quote=rbmurussi]utiliza o @Query ou seja:

@Query(value="SELECT t FROM Tabela t WHERE t.campo4 = TO_CHAR(:campo4)")
List<Table> findByCampo4(@Param("campo4") Long campo4);

ou teste:

@Query(value="SELECT t FROM Tabela t WHERE t.campo4 = :campo4") List<Table> findByCampo4(String campo4); [/quote]

rbmurussi, sua dica é válida, porém não quero que minha query seja “fixa”, ou seja, alguns campos da cláusula where podem não ser enviados, pois o usuário não é obrigado a preencher. Dessa forma, não quero que os campos NULL sejam enviados na consulta. Isso também ajuda na performance. Por isso não faço o uso do @Query para essa consulta específica.
A maneira que consegui resolver por enquanto foi utilizando a cláusula IN
Dessa forma:

				if(campo4 != null){
					final List<String> campos = new ArrayList<String>();
					campos.add(campo4);
					p5 = root.get(MinhaTabela_.campo4Tabela).in(campos);
				}