Hibernate: query com multiplos joins e parenteses

Tenho de usar o Hibernate com o MS Access e estou tendo um problema: quando tenho uma entidade com mais de um relacionamento, as querys nao funcionam. Configurando pro hibernate mostrar o SQL, vi que o framework monta um sql utilizando multiplos joins, mais ou menos assim:

select a.col1,
a.col2,
b.col1,
b.col2,
c.col1
from tabela1 a
left outer join tabela2 b on a.col1 = b.col1
left outer join tablela3 c on a.col1 = b.col1

só que o Acess não aceita essa sintaxe, você deve colocar entre parênteses os joins

select a.col1,
a.col2,
b.col1,
b.col2,
c.col1
from tabela1 a
left outer join (tabela2 b
left outer join tablela3 c on a.col1 = b.col1)
on a.col1 = b.col1

Minha dúvida: existe alguma forma de mudar a sintaxe que o Hibernate utiliza pra montar as querys? Estou tendo de fazer chamados em SQL puro toda vez que isso acontece, está ficando contraprodivo…

O dialeto que vc está usando está correto?

Tive de criar um dialeto porque não encontrei uma classe gratuita.

Aliás, criar não, encontrei na Net, acho que foi até aqui no GUJ. Mas como ele herda quase tudo de um genérico, não implementa essa parte e não encontrei uma referência de como deveria sobrescrever pra atender, ou sei isso é complexo.

Hibernate com Access?

A vida de programador é sofrida…

[quote=felipeguerra]Hibernate com Access?

A vida de programador é sofrida…[/quote]

Pois é, o cúmulo do absurdo, mas tenho um cliente que é apaixonado pelo Access e não abre mão.

O dialeto que criei pro Access, foi esse:
http://www.guj.com.br/java/27514-duvidas-hibernate

Funciona, com o único detalhe que você não pode ativer o SQL Comment do hibernate, porque o Access se confunde com os comentários e fala que o comando é inválido.

Só pra deixar documentado no tópico caso alguem venha pesquisar nele, pro dialeto funcionar é preciso sobrescrever o método transformSelectString.
Encontrei o exemplo listado abaixo,mas ele não conseguiu formatar corretamente, precisa ser melhorado.


@Override
    public String transformSelectString(String select) {
        // Access supports joins as per ANSI but without the "outer" keyword
        int matches = StringUtils.countMatches(select, " outer join ")
                + StringUtils.countMatches(select, " inner join ");
        if (matches > 0) {
            select = StringUtils.replace(select, " left outer join ", ") left join ");
            select = StringUtils.replace(select, " right outer join ", ") right join ");
            select = StringUtils.replace(select, " inner join ", ") inner join ");
            select = StringUtils.replace(select, "from ", "from " + StringUtils.repeat("(", matches));
        }
        return select;
    }

Como meu projeto está atrasado, eu tinha duas opções: quebrava a cabeça nesse dialeto pra conseguir usar o Hibernate na sua plenitude ou chutava o balde e diminuia as referencias à relacionamentos nos meus pojos e usava SQL puro quando necessário.

Acabou que preferi esquecer o dialeto porque corria o risco de demorar demais pra arrumá-lo e estourar o projeto, mas assim que tiver tempo, posto a solução completa. Ou se alguém estiver a fim de tentar, pelo menos dei o caminho das pedras.