Pessoal,
Estou trabalhando em uma aplicação JSF que gerencia a emissão de diplomas de uma universidade.
Estamos usando EclipseLink e base de dados está construída em Oracle 10g.
Ao efetuar, na tabela DIPLOMAS,a seguinte consulta :
select t.diplo_nome_aluno
from diplomas t
where t.diplo_nome_aluno like 'ANA%'
and t.diplo_situacao = 10
order by t.diplo_nome_aluno ASC
o resultado é gerado é visualizado corretamente no PL/SQL Developer.
O campo t.diplo_situacao = 10 significa os diplomas que já foram assinados pelas autoridades competentes.
Quando efetuo a consulta pela aplicação, a página de resultado é exibida ocorrendo algo do tipo
...
ANA ANGÉLICA ALVES FEITOSA
ANA BEATRIZ DE CALDAS FABRICIO
ANABEL ALVES DE SOUSA
ANABEL DEL CARMEN DIAZ YANGUEZ
ANA BEZERRA DA SILVA
...
Como vocês podem ver logo acima, a ordenação alfabética está errada, uma vez que “ANABEL” só deveria aparecer depois de todas as ocorrências de "ANA ".
Uma vez que o problema acima não acontece quando executo a query(exibida logo no início do post) diretamente no banco, acredito que o problema esteja acontecendo entre o EclipseLink e a camada de visão.
Segue, abaixo, o código do método cujo retorno deveria ser a lista de diplomas com a ordenação alfabética correta
public List<Diploma> findDiplomaAvancado(DiplomaBean consulta) {
String query = "SELECT * FROM DIPLOMAS";
Map<String, Object> parametros = new HashMap<String, Object>();
if (!consulta.getNome().trim().equals("")) {
String[] words = consulta.getNome().split("\\s");
char primeiro = consulta.getNome().charAt(0);
System.out.println("primeiro : " + primeiro);
for (String word : words) {
query += addConditionPrefix(query) + "regexp_like(DIPLO_NOME_ALUNO,'(primeiro% |^)"+ word +".*','i')";
}
}
if (!consulta.getCpf().equals("")) {
query += addConditionPrefix(query) + "DIPLO_CPF = '" + consulta.getCpf() + "'";
}
if (!consulta.getIdentidade().equals("")) {
query += addConditionPrefix(query) + "DIPLO_RG_NUM = '" + consulta.getIdentidade() + "'";
}
if (!consulta.getProcesso().equals("")) {
query += addConditionPrefix(query) + "DIPLO_PROCESSO_NUM = '" + consulta.getProcesso().replaceAll("\\.", "").replaceAll("/", "").replace("-", "") + "'";
}
DateFormat formatacaoData = new SimpleDateFormat("dd/MM/yyyy");
if (consulta.getDataInicial() != null && consulta.getDataFinal() != null) {
query += addConditionPrefix(query) + "DIPLO_PROCESSO_DATA BETWEEN '" + formatacaoData.format(consulta.getDataInicial()) + "' AND '" + formatacaoData.format(consulta.getDataFinal()) + "'";
//parametros.put("start", consulta.getDataInicial());
//parametros.put("end", consulta.getDataFinal());
} else {
if (consulta.getDataInicial() != null) {
query += addConditionPrefix(query) + "DIPLO_PROCESSO_DATA >= '" + formatacaoData.format(consulta.getDataInicial()) + "'";
parametros.put("start", consulta.getDataInicial());
}
if (consulta.getDataFinal() != null) {
query += addConditionPrefix(query) + "DIPLO_PROCESSO_DATA <= '" + formatacaoData.format(consulta.getDataFinal()) + "'";
parametros.put("end", consulta.getDataFinal());
}
}
if (consulta.getSituacao() != 0) {
query += addConditionPrefix(query) + "DIPLO_SITUACAO = " + consulta.getSituacao();
}
query += addConditionPrefix(query) + "ROWNUM BETWEEN 1 AND 500";
String consultaQuery = query + " ORDER BY DIPLO_NOME_ALUNO ASC";
System.out.println(consultaQuery);
DiplomaDao dDao = new DiplomaDao();
try {
return dDao.findDiplomaAvancado(consultaQuery, parametros);
} catch (Exception e) {
return null;
} finally {
dDao.close();
}
}
Há dois trecho no código acima que merecem ser destacados.
O primeiro é que o cláusula necessária para a ordenação alfabética exite, como segue
...
String consultaQuery = query + " ORDER BY DIPLO_NOME_ALUNO ASC";
...
E o segundo, se refere a um outro problema que estamos enfretando, onde um índice que necessitamos criar no Oracle para o campo DIPLO_NOME_ALUNO, só está funcionando se for repassado, para o “LIKE” abaixo, o primeiro caracter do Nome do Aluno. (não me perguntem porquê ).
...
char primeiro = consulta.getNome().charAt(0);
System.out.println("primeiro : " + primeiro);
for (String word : words) {
query += addConditionPrefix(query) + "regexp_like(DIPLO_NOME_ALUNO,'(primeiro% |^)"+ word +".*','i')";
}
Alguém poderia me dar alguma idéia de onde pode estar ocorrendo o problema, já que no banco a query traz o resultado correto.
Agradece,
Max Carvalho