já leu sobre o JPA 2 ?
a especificação na verdade é um ponto de convergencia....
dificlmente uma especificação vai correr a frente da implementação.... afinal novas ideias aparecem o tempo todo... e a especificação é um conjunto das melhores.... e tenta reunir tudo em um sento comum e ponto comum....
realmente tem loucuras de bancos legados que é foda de fazer com JPA e da dor de cabeça.... e vc acaba usando anotações do Hiberante.... mas no geral, pra anotaçõeso JPA cobre tudo.... desde que não seja um banco maluco legado...
...........
Para buscas, eu não troco os Criterias pelas HQLs do JPA, mas também não exponho elas para meu projeto, e uso objetos Queries, para meu projeto não tercontato com o Hiberante, e sim com uma interface de mais alto nivel....
assim posso continuar reusando.... por exemplo, trocar do Hiberante 3 para a proxima versão que vai implementar o JPA 2, vai ser relativamente fácil para meus projetos, pois só vou reescrever a camada de persistencia, um conjunto de 8 classes no máximo.
Lógico que não vou pegar meu projeto que ta escrito com criterias 3.x, e com hiberante e etc, e enfiar o Hibernate novo para JPA 2, pq isso seria sem sentido... porem vou conseguir reusuar a mesma lógica em novos projetos, sem ser afetado pela camada de persistencia...
..........
Obs.: eu entendo sua revolta... já pensei igual, mas me ajudar muito, conseguir não programar diretamente com o hiberante....
aqui vai um exemplo de código em meus projetos...
repository.addAll(carros);
repoistory.removeAll(telefones);
List<PessoaFisica> pessoasAtivas = queries.forPessoa().listPessoasAtivas().queryOn(repository);
todas são de facil leitura, Repository éuma INterface.... e a implementação normal que uso é pra Hiberante.... mas já precisei usar pra SQL puro entre outras firulas, por questões diversas
..........
em momento algum em meu projeto há um new HibernateRepository .... quando não uso algo como spring, o HiberanteRepository vem sempre de algo como
Repository repository = minhaFabrica.createRepository();
no caso é só trocar o que vem do CreateRepository e voala! .... mudo a implementação facilmente...